library(dplyr) library(plyr)

#mercury data frames DFfl25miA <- as.data.frame(fl25miA) DFfl100miA <- as.data.frame(fl100miA) DFfl25miB <- as.data.frame(fl25miB) DFfl100miB <- as.data.frame(fl100miB) DFla25miA <- as.data.frame(la25miAsw) DFla100miA <- as.data.frame(la100miAsw) DFla25miBA <- as.data.frame(la25miBAsw) DFla100miBA <- as.data.frame(la100miBAsw)

#relevant mrip data landOtimA landOtimB landTtimA landTtimB

#isolate species, biomass, landings, per site - FLorida

DFfl25miA$Whole_weight <- as.numeric(DFfl25miA$Whole_weight)
NAs introduced by coercion
DFfl25miA$TL <- as.numeric(DFfl25miA$TL)

str(DFfl25miA)
'data.frame':   308 obs. of  37 variables:
 $ Group         : int  121 120 122 122 122 122 122 122 122 122 ...
 $ Bottle        : chr  "TB04010" "TB04009" "TB0400757-D" "TB0400721-D" ...
 $ Location.x    : chr  "TBM" "TBX" "TB" "TB" ...
 $ Field_no      : chr  "TBM04110906" "TBX04062101?" "" "" ...
 $ Spec_no       : int  NA NA 1 1 2 3 4 2 1 1 ...
 $ FIM_spec_no   : chr  "1" "1" "." "." ...
 $ Other_field_no: chr  "" "" "1530420040428037" "1000920040423002" ...
 $ Date          : int  20041104 20040621 20040428 20040423 20040423 20040423 20040423 20040423 20040423 20040421 ...
 $ New_date      : chr  "11/4/2004" "6/21/2004" "4/28/2004" "4/23/2004" ...
 $ Year          : int  2004 2004 2004 2004 2004 2004 2004 2004 2004 2004 ...
 $ Scfname       : chr  "Rachycentron canadum" "Carcharhinus leucas" "PARALICHTHYS ALBIGUTTA" "EPINEPHELUS MORIO" ...
 $ Species       : chr  "Cobia " "Bull shark " "Gulf flounder " "Red grouper " ...
 $ NODCCODE      : num  8.84e+09 8.71e+09 8.86e+09 8.84e+09 8.84e+09 ...
 $ Sex           : chr  "F" "F" "F" "U" ...
 $ SL            : chr  "1030" "." "289" "417" ...
 $ FL            : chr  "1122" "." "350" "193" ...
 $ TL            : num  1279 2800 350 518 535 ...
 $ Whole_weight  : num  NA NA NA 2 2 2 2 2 NA 5 ...
 $ Zone          : chr  "b" "" " " " " ...
 $ Grid          : chr  "." "." "." "." ...
 $ Lat_deg       : chr  "." "." "." "." ...
 $ Lat_min       : chr  "." "." "." "." ...
 $ Site          : chr  "big bayou" "found at gandy ramp" "ruskin" "clearwater" ...
 $ Region.x      : chr  "MW" "MW" "Tampa Bay" "Tampa Bay" ...
 $ Hg            : num  0.8 1.9 0.16 0.24 0.33 0.28 0.25 0.32 0.6 0.72 ...
 $ Lat_Deg       : int  27 27 27 27 27 27 27 27 27 27 ...
 $ Lat_Min       : num  44.3 53.5 43.6 58.3 58.3 ...
 $ Lon           : int  82 82 82 82 82 82 82 82 82 82 ...
 $ Lon_Deg       : int  -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 ...
 $ Lon_Min       : num  38.4 32 28.8 48.3 48.3 ...
 $ Region.y      : chr  "TB" "MW" "MW" "MW" ...
 $ Location.y    : chr  "big bayou" "found at gandy ramp" "Ruskin" "Clearwater" ...
 $ LatDD         : num  27.7 27.9 27.7 28 28 ...
 $ LonDD         : num  -82.6 -82.5 -82.5 -82.8 -82.8 ...
 $ INTSITE       : num  770 770 770 770 770 770 770 770 770 770 ...
 $ LonDD.1       : num  136935 147519 152596 120875 120875 ...
 $ LatDD.1       : num  377392 394346 376032 403396 403396 ...
mercFL25miA <- DFfl25miA %>% 
  group_by(INTSITE,Species) %>% 
  summarise(n = n(), aveWt = mean(Whole_weight, na.rm = TRUE), 
            aveLt = mean(TL, na.rm = TRUE), aveHg = mean(Hg, na.rm = TRUE))

mercFL25miA 

DFfl100miA$Whole_weight <- as.numeric(DFfl100miA$Whole_weight)
NAs introduced by coercion
DFfl100miA$TL <- as.numeric(DFfl100miA$TL)

mercFL100miA <- DFfl100miA %>% 
  group_by(INTSITE,Species) %>% 
  summarise(n = n(), aveWt = mean(Whole_weight, na.rm = TRUE), 
            aveLt = mean(TL, na.rm = TRUE), aveHg = mean(Hg, na.rm = TRUE))

mercFL100miA 

DFfl25miB$Whole_weight <- as.numeric(DFfl25miB$Whole_weight)
NAs introduced by coercion
DFfl25miB$TL <- as.numeric(DFfl25miB$TL)

mercFL25miB <- DFfl25miB %>% 
  group_by(INTSITE,Species) %>% 
  summarise(n = n(), aveWt = mean(Whole_weight, na.rm = TRUE), 
            aveLt = mean(TL, na.rm = TRUE), aveHg = mean(Hg, na.rm = TRUE))

mercFL25miB 

DFfl100miB$Whole_weight <- as.numeric(DFfl100miB$Whole_weight)
NAs introduced by coercion
DFfl100miB$TL <- as.numeric(DFfl100miB$TL)

mercFL100miB <- DFfl100miB %>% 
  group_by(INTSITE,Species) %>% 
  summarise(n = n(), aveWt = mean(Whole_weight, na.rm = TRUE), 
            aveLt = mean(TL, na.rm = TRUE), aveHg = mean(Hg, na.rm = TRUE))

mercFL100miB 

#MRIP
landTtimA
landTtimB

mripFLa <- landTtimA %>% 
  group_by(INTSITE,common) %>% 
  summarise(n = n(), landings = sum(landing), biomass = sum(wgt_ab1, na.rm = TRUE))
mripFLa

mripFLb <- landTtimB %>% 
  group_by(INTSITE,common) %>% 
  summarise(n = n(), landings = sum(landing), biomass = sum(wgt_ab1, na.rm = TRUE))
mripFLb

Add in NOLA

str(DFla25miA)
'data.frame':   256 obs. of  24 variables:
 $ WaterBody    : chr  "Grand Bayou Blue southwest of Galliano, Louisiana" "Grand Bayou Blue southwest of Galliano, Louisiana" "Grand Bayou Blue southwest of Galliano, Louisiana" "Grand Bayou Blue southwest of Galliano, Louisiana" ...
 $ SiteNum      : chr  "3438" "3438" "3438" "3438" ...
 $ Subsegment   : chr  "LA120706_00" "LA120706_00" "LA120706_00" "LA120706_00" ...
 $ CollectDate  : chr  "2/5/2007" "2/5/2007" "2/5/2007" "2/5/2007" ...
 $ CollectYear  : int  2007 2007 2007 2007 2007 2007 2007 2007 2007 2007 ...
 $ SampleType   : chr  "Single Fish" "Single Fish" "Composite" "Composite" ...
 $ Parameter    : chr  "MERCURY" "MERCURY" "MERCURY" "MERCURY" ...
 $ HgResult     : num  0.0864 0.0692 0.0303 0.0316 0.0452 0.0233 0.095 0.0537 0.0843 0.0771 ...
 $ Units        : chr  "ppm" "ppm" "ppm" "ppm" ...
 $ spName       : chr  "SHEEPSHEAD" "SPOTTED SEATROUT" "SHEEPSHEAD" "SHEEPSHEAD" ...
 $ aveWt_g      : num  1590 385 594 918 1103 ...
 $ aveLen_cm    : num  45.4 34 32.1 37.4 38.8 38.5 50.7 40.1 54.7 62.1 ...
 $ PROJ_NUM     : chr  "WQ1994001" "WQ1994001" "WQ1994001" "WQ1994001" ...
 $ PROJECT_NAME : chr  "Mercury Contaminant Levels in Louisiana Biota" "Mercury Contaminant Levels in Louisiana Biota" "Mercury Contaminant Levels in Louisiana Biota" "Mercury Contaminant Levels in Louisiana Biota" ...
 $ SITE_NAME    : chr  "Grand Bayou Blue southwest of Galliano, Louisiana" "Grand Bayou Blue southwest of Galliano, Louisiana" "Grand Bayou Blue southwest of Galliano, Louisiana" "Grand Bayou Blue southwest of Galliano, Louisiana" ...
 $ SITE_LOCATION: chr  "4.6 miles southwest of Galliano, 5.3 miles northwest of Golden Meadow, 12.7 miles south of Larose" "4.6 miles southwest of Galliano, 5.3 miles northwest of Golden Meadow, 12.7 miles south of Larose" "4.6 miles southwest of Galliano, 5.3 miles northwest of Golden Meadow, 12.7 miles south of Larose" "4.6 miles southwest of Galliano, 5.3 miles northwest of Golden Meadow, 12.7 miles south of Larose" ...
 $ SUBSEGMENT   : chr  "LA120706_00" "LA120706_00" "LA120706_00" "LA120706_00" ...
 $ UTM_E        : num  757506 757506 757506 757506 757506 ...
 $ UTM_N        : num  3254192 3254192 3254192 3254192 3254192 ...
 $ LONG         : num  -90.3 -90.3 -90.3 -90.3 -90.3 ...
 $ LAT          : num  29.4 29.4 29.4 29.4 29.4 ...
 $ INTSITE      : num  222 222 222 222 222 222 222 222 222 222 ...
 $ LONG.1       : num  1095774 1095774 1095774 1095774 1095774 ...
 $ LAT.1        : num  99135 99135 99135 99135 99135 ...
mercLA25miA <- DFla25miA %>% 
  group_by(INTSITE,spName) %>% 
  summarise(n = n(), aveWt = mean(aveWt_g, na.rm = TRUE), 
            aveLt = mean(aveLen_cm, na.rm = TRUE), aveHg = mean(HgResult, na.rm = TRUE))
mercLA25miA 

mercLA100miA <- DFla100miA %>% 
  group_by(INTSITE,spName) %>% 
  summarise(n = n(), aveWt = mean(aveWt_g, na.rm = TRUE), 
            aveLt = mean(aveLen_cm, na.rm = TRUE), aveHg = mean(HgResult, na.rm = TRUE))
mercLA100miA 

mercLA25miBA <- DFla25miBA %>% 
  group_by(INTSITE,spName) %>% 
  summarise(n = n(), aveWt = mean(aveWt_g, na.rm = TRUE), 
            aveLt = mean(aveLen_cm, na.rm = TRUE), aveHg = mean(HgResult, na.rm = TRUE))
mercLA25miBA 

mercLA100miBA <- DFla100miBA %>% 
  group_by(INTSITE,spName) %>% 
  summarise(n = n(), aveWt = mean(aveWt_g, na.rm = TRUE), 
            aveLt = mean(aveLen_cm, na.rm = TRUE), aveHg = mean(HgResult, na.rm = TRUE))
mercLA100miBA 

#MRIP
mripLAa <- landOtimA %>% 
  group_by(INTSITE,common) %>% 
  summarise(n = n(), landings = sum(landing), biomass = sum(wgt_ab1, na.rm = TRUE))
mripLAa

mripLAb <- landOtimB %>% 
  group_by(INTSITE,common) %>% 
  summarise(n = n(), landings = sum(landing), biomass = sum(wgt_ab1, na.rm = TRUE))
mripLAb
NA

Try to indicate which entries are tested in mrip

str(landOtimA)
'data.frame':   545 obs. of  20 variables:
 $ YEAR           : chr  "2005" "2005" "2005" "2005" ...
 $ REG_RES        : int  7 7 7 7 7 7 7 7 7 7 ...
 $ ST_RES         : int  22 22 22 22 22 22 22 22 22 22 ...
 $ CNTY_RES       : int  95 95 95 51 51 51 51 51 51 51 ...
 $ ST             : chr  "22" "22" "22" "22" ...
 $ CNTY           : int  57 57 57 57 57 57 57 57 57 51 ...
 $ INTSITE        : int  231 231 231 231 231 231 231 231 231 222 ...
 $ MODE_F         : int  5 5 5 5 5 5 5 5 5 5 ...
 $ MODE_FX        : chr  "3" "3" "3" "3" ...
 $ ID_CODE        : chr  "1517620051011001" "1517620051011001" "1517620051011001" "1517620051011003" ...
 $ ZIP            : chr  "70084" "70084" "70084" "70062" ...
 $ common         : chr  "SHEEPSHEAD" "SPOTTED SEATROUT" "RED DRUM" "SPOTTED SEATROUT" ...
 $ WAVE           : int  5 5 5 5 5 5 5 5 5 5 ...
 $ SP_CODE        : num  8.84e+09 8.84e+09 8.84e+09 8.84e+09 8.84e+09 ...
 $ harv_d3        : num  0 0 0 0 0 0 0 0 0 0 ...
 $ wgt_ab1        : num  0.45 0.275 8.7 0.254 0.798 ...
 $ landing        : num  0.5 1 4.5 0.725 0.725 ...
 $ testStatus     : chr  "Not Tested" "Not Tested" "Not Tested" "Not Tested" ...
 $ testStatus25mi : chr  "Tested" "Tested" "Tested" "Tested" ...
 $ testStatus100mi: chr  "Tested" "Tested" "Tested" "Tested" ...
str(mercLA25miA)
Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 25 obs. of  6 variables:
 $ INTSITE: num  151 151 151 151 151 155 155 155 155 155 ...
 $ spName : chr  "BLACK DRUM" "RED DRUM" "SHEEPSHEAD" "SOUTHERN FLOUNDER" ...
 $ n      : int  3 8 8 3 6 4 27 9 5 5 ...
 $ aveWt  : num  404 1756 993 467 445 ...
 $ aveLt  : num  193 53.2 37.1 33.6 35.8 ...
 $ aveHg  : num  0.0336 0.0753 0.054 0.0251 0.0667 ...
 - attr(*, "groups")=Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  5 obs. of  2 variables:
  ..$ INTSITE: num  151 155 222 231 306
  ..$ .rows  :List of 5
  .. ..$ : int  1 2 3 4 5
  .. ..$ : int  6 7 8 9 10
  .. ..$ : int  11 12 13 14 15
  .. ..$ : int  16 17 18 19 20
  .. ..$ : int  21 22 23 24 25
  ..- attr(*, ".drop")= logi TRUE
unique(mercLA25miA$spName)
[1] "BLACK DRUM"        "RED DRUM"          "SHEEPSHEAD"        "SOUTHERN FLOUNDER"
[5] "SPOTTED SEATROUT" 
#top sites = 222, 231, 306, 155, 151, within 25 mi
unique(mercLA25miA$INTSITE)
[1] 151 155 222 231 306
unique(landOtimA$INTSITE)
[1] 231 222 306 155 151
O222a25 <- subset(mercLA25miA,mercLA25miA$INTSITE == '222')
O231a25 <- subset(mercLA25miA,mercLA25miA$INTSITE == '231')
O306a25 <- subset(mercLA25miA,mercLA25miA$INTSITE == '306')
O155a25 <- subset(mercLA25miA,mercLA25miA$INTSITE == '155')
O151a25 <- subset(mercLA25miA,mercLA25miA$INTSITE == '151')

indLA25a222 <- which((landOtimA$common %in% O222a25$spName) & (landOtimA$INTSITE == '222'))
str(indLA25a222)
 int [1:173] 11 12 19 22 23 24 31 37 38 40 ...
landOtimA[indLA25a222,]

landOtimA$testStatus25mi <- rep('NA', nrow(landOtimA))
landOtimA$testStatus25mi[indLA25a222] <- 'Tested'

indLA25a231 <- which((landOtimA$common %in% O231a25$spName) & (landOtimA$INTSITE == '231'))
str(indLA25a231)
 int [1:101] 1 2 3 4 5 6 8 9 13 14 ...
landOtimA[indLA25a231,]
landOtimA$testStatus25mi[indLA25a231] <- 'Tested'

indLA25a306 <- which((landOtimA$common %in% O306a25$spName) & (landOtimA$INTSITE == '306'))
str(indLA25a306)
 int [1:39] 58 175 176 177 178 191 192 194 215 216 ...
landOtimA[indLA25a306,]
landOtimA$testStatus25mi[indLA25a306] <- 'Tested'

indLA25a155 <- which((landOtimA$common %in% O155a25$spName) & (landOtimA$INTSITE == '155'))
str(indLA25a155)
 int [1:30] 64 145 146 148 149 150 203 204 209 301 ...
landOtimA[indLA25a155,]
landOtimA$testStatus25mi[indLA25a155] <- 'Tested'

indLA25a151 <- which((landOtimA$common %in% O151a25$spName) & (landOtimA$INTSITE == '151'))
str(indLA25a151)
 int [1:11] 236 250 291 292 322 410 411 519 525 537 ...
landOtimA[indLA25a151,]
landOtimA$testStatus25mi[indLA25a151] <- 'Tested'

landOtimA$testStatus25mi[landOtimA$testStatus25mi %in% 'NA'] <- 'Not Tested'

#top sites = 222, 231, 306, 155, 151, within 100 mi
unique(mercLA100miA$INTSITE)
[1] 151 155 222 231 306
unique(mercLA100miA$spName)
 [1] "BLACK DRUM"        "BLACKFIN TUNA"     "COBIA"             "GRAY SNAPPER"     
 [5] "GRAY TRIGGERFISH"  "KING MACKEREL"     "RED DRUM"          "RED SNAPPER"      
 [9] "SHEEPSHEAD"        "SOUTHERN FLOUNDER" "SPOTTED SEATROUT"  "STRIPED BASS"     
unique(landOtimA$INTSITE)
[1] 231 222 306 155 151
O222a100 <- subset(mercLA100miA,mercLA100miA$INTSITE == '222')
O231a100 <- subset(mercLA100miA,mercLA100miA$INTSITE == '231')
O306a100 <- subset(mercLA100miA,mercLA100miA$INTSITE == '306')
O155a100 <- subset(mercLA100miA,mercLA100miA$INTSITE == '155')
O151a100 <- subset(mercLA100miA,mercLA100miA$INTSITE == '151')

indLA100a222 <- which((landOtimA$common %in% O222a100$spName) & (landOtimA$INTSITE == '222'))
str(indLA100a222)
 int [1:175] 11 12 19 22 23 24 31 37 38 40 ...
landOtimA[indLA100a222,]

landOtimA$testStatus100mi <- rep('NA', nrow(landOtimA))
landOtimA$testStatus100mi[indLA100a222] <- 'Tested'

indLA100a231 <- which((landOtimA$common %in% O231a100$spName) & (landOtimA$INTSITE == '231'))
str(indLA100a231)
 int [1:101] 1 2 3 4 5 6 8 9 13 14 ...
landOtimA[indLA100a231,]
landOtimA$testStatus100mi[indLA100a231] <- 'Tested'

indLA100a306 <- which((landOtimA$common %in% O306a100$spName) & (landOtimA$INTSITE == '306'))
str(indLA100a306)
 int [1:39] 58 175 176 177 178 191 192 194 215 216 ...
landOtimA[indLA100a306,]
landOtimA$testStatus100mi[indLA100a306] <- 'Tested'

indLA100a155 <- which((landOtimA$common %in% O155a100$spName) & (landOtimA$INTSITE == '155'))
str(indLA100a155)
 int [1:30] 64 145 146 148 149 150 203 204 209 301 ...
landOtimA[indLA100a155,]
landOtimA$testStatus100mi[indLA100a155] <- 'Tested'

indLA100a151 <- which((landOtimA$common %in% O151a100$spName) & (landOtimA$INTSITE == '151'))
str(indLA100a151)
 int [1:11] 236 250 291 292 322 410 411 519 525 537 ...
landOtimA[indLA100a151,]
landOtimA$testStatus100mi[indLA100a151] <- 'Tested'

landOtimA$testStatus100mi[landOtimA$testStatus100mi %in% 'NA'] <- 'Not Tested'

landOtimA

LAaProp25mi <- landOtimA %>%
  group_by(INTSITE, testStatus25mi) %>%
  summarise(n_distinct(common), landings = sum(landing), biomass = sum(wgt_ab1))

LAaProp100mi <- landOtimA %>%
  group_by(INTSITE, testStatus100mi) %>%
  summarise(n_distinct(common), landings = sum(landing), biomass = sum(wgt_ab1))

write.csv(LAaProp25mi, "~/FUIteam/PydioData/env/data_outputs/LAaProp25mi.csv")
write.csv(LAaProp100mi, "~/FUIteam/PydioData/env/data_outputs/LAaProp100mi.csv")

New Orleans Time Chunk B

str(landOtimB)
'data.frame':   225 obs. of  19 variables:
 $ YEAR           : chr  "2010" "2010" "2010" "2010" ...
 $ REG_RES        : int  7 7 7 7 7 7 7 7 7 7 ...
 $ ST_RES         : int  22 22 22 22 22 22 22 22 22 22 ...
 $ CNTY_RES       : int  89 51 93 51 51 51 89 71 71 71 ...
 $ ST             : chr  "22" "22" "22" "22" ...
 $ CNTY           : int  51 51 51 51 51 51 51 51 51 51 ...
 $ INTSITE        : int  159 222 222 222 222 222 222 222 222 222 ...
 $ MODE_F         : int  5 5 5 5 5 5 3 5 5 5 ...
 $ MODE_FX        : chr  "3" "3" "3" "3" ...
 $ ID_CODE        : chr  "1541220100214013" "1517620100130002" "1517620100130005" "1517620100214009" ...
 $ ZIP            : chr  "70070" "70358" "70090" "70358" ...
 $ common         : chr  "RED DRUM" "SPOTTED SEATROUT" "SPOTTED SEATROUT" "SHEEPSHEAD" ...
 $ WAVE           : int  1 1 1 1 1 1 2 2 2 2 ...
 $ SP_CODE        : num  8.84e+09 8.84e+09 8.84e+09 8.84e+09 8.84e+09 ...
 $ harv_d3        : num  0 0 9 2.65 0 ...
 $ wgt_ab1        : num  1.8 5.56 2.88 2.12 3.4 ...
 $ landing        : num  1 15.89 9 2.65 9.5 ...
 $ testStatus25mi : chr  "Tested" "Tested" "Tested" "Tested" ...
 $ testStatus100mi: chr  "Tested" "Tested" "Tested" "Tested" ...
str(mercLA25miBA)
Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 23 obs. of  6 variables:
 $ INTSITE: chr  "151ba" "151ba" "151ba" "151ba" ...
 $ spName : chr  "BLACK DRUM" "RED DRUM" "SHEEPSHEAD" "SOUTHERN FLOUNDER" ...
 $ n      : int  3 8 8 3 6 5 12 11 6 10 ...
 $ aveWt  : num  404 1756 993 467 445 ...
 $ aveLt  : num  193 53.2 37.1 33.6 35.8 ...
 $ aveHg  : num  0.0336 0.0753 0.054 0.0251 0.0667 ...
 - attr(*, "groups")=Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  5 obs. of  2 variables:
  ..$ INTSITE: chr  "151ba" "159ba" "222ba" "306ba" ...
  ..$ .rows  :List of 5
  .. ..$ : int  1 2 3 4 5
  .. ..$ : int  6 7 8 9 10
  .. ..$ : int  11 12 13 14 15
  .. ..$ : int  16 17 18 19 20
  .. ..$ : int  21 22 23
  ..- attr(*, ".drop")= logi TRUE
unique(mercLA25miBA$spName)
[1] "BLACK DRUM"        "RED DRUM"          "SHEEPSHEAD"        "SOUTHERN FLOUNDER"
[5] "SPOTTED SEATROUT"  "STRIPED BASS"     
str(mercLA25miA)
Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 25 obs. of  6 variables:
 $ INTSITE: num  151 151 151 151 151 155 155 155 155 155 ...
 $ spName : chr  "BLACK DRUM" "RED DRUM" "SHEEPSHEAD" "SOUTHERN FLOUNDER" ...
 $ n      : int  3 8 8 3 6 4 27 9 5 5 ...
 $ aveWt  : num  404 1756 993 467 445 ...
 $ aveLt  : num  193 53.2 37.1 33.6 35.8 ...
 $ aveHg  : num  0.0336 0.0753 0.054 0.0251 0.0667 ...
 - attr(*, "groups")=Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  5 obs. of  2 variables:
  ..$ INTSITE: num  151 155 222 231 306
  ..$ .rows  :List of 5
  .. ..$ : int  1 2 3 4 5
  .. ..$ : int  6 7 8 9 10
  .. ..$ : int  11 12 13 14 15
  .. ..$ : int  16 17 18 19 20
  .. ..$ : int  21 22 23 24 25
  ..- attr(*, ".drop")= logi TRUE
str(mercLA100miA)
Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 58 obs. of  6 variables:
 $ INTSITE: num  151 151 151 151 151 151 151 151 151 151 ...
 $ spName : chr  "BLACK DRUM" "BLACKFIN TUNA" "COBIA" "GRAY SNAPPER" ...
 $ n      : int  14 1 3 17 2 5 145 3 73 28 ...
 $ aveWt  : num  950 9049 13922 1930 1108 ...
 $ aveLt  : num  73.2 77.5 113.4 49 40.6 ...
 $ aveHg  : num  0.0794 0.7111 0.5897 0.1207 0.1118 ...
 - attr(*, "groups")=Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  5 obs. of  2 variables:
  ..$ INTSITE: num  151 155 222 231 306
  ..$ .rows  :List of 5
  .. ..$ : int  1 2 3 4 5 6 7 8 9 10 ...
  .. ..$ : int  13 14 15 16 17 18 19 20 21 22 ...
  .. ..$ : int  24 25 26 27 28 29 30 31 32 33 ...
  .. ..$ : int  36 37 38 39 40 41 42 43 44 45 ...
  .. ..$ : int  48 49 50 51 52 53 54 55 56 57 ...
  ..- attr(*, ".drop")= logi TRUE
unique(mercLA25miBA$spName)
[1] "BLACK DRUM"        "RED DRUM"          "SHEEPSHEAD"        "SOUTHERN FLOUNDER"
[5] "SPOTTED SEATROUT"  "STRIPED BASS"     
unique(mercLA100miBA$spName)
 [1] "BLACK DRUM"        "BLACKFIN TUNA"     "COBIA"             "GRAY SNAPPER"     
 [5] "GRAY TRIGGERFISH"  "KING MACKEREL"     "RED DRUM"          "RED SNAPPER"      
 [9] "SHEEPSHEAD"        "SOUTHERN FLOUNDER" "SPOTTED SEATROUT"  "STRIPED BASS"     
unique(landOtimB$common)
 [1] "RED DRUM"            "SPOTTED SEATROUT"    "SHEEPSHEAD"         
 [4] "SOUTHERN FLOUNDER"   "HARDHEAD CATFISH"    "GAFFTOPSAIL CATFISH"
 [7] "SAND SEATROUT"       "PINFISH"             "SOUTHERN KINGFISH"  
[10] "BLACK DRUM"          "ATLANTIC CROAKER"    "GULF KINGFISH"      
[13] "SILVER PERCH"        "BLUE CATFISH"        "BLUEGILL"           
[16] "SKIPJACK HERRING"   
#top sites = 222, 159, 306, 3325, 151, within 25 mi
unique(mercLA25miBA$INTSITE)
[1] "151ba"  "159ba"  "222ba"  "306ba"  "3325ba"
unique(landOtimB$INTSITE)
[1]  159  222 3325  151  306
O222ba25 <- subset(mercLA25miBA,mercLA25miBA$INTSITE == '222ba')
O3325ba25 <- subset(mercLA25miBA,mercLA25miBA$INTSITE == '3325ba')
O306ba25 <- subset(mercLA25miBA,mercLA25miBA$INTSITE == '306ba')
O159ba25 <- subset(mercLA25miBA,mercLA25miBA$INTSITE == '159ba')
O151ba25 <- subset(mercLA25miBA,mercLA25miBA$INTSITE == '151ba')

indLA25b222 <- which((landOtimB$common %in% O222ba25$spName) & (landOtimB$INTSITE == '222'))
str(indLA25b222)
 int [1:116] 2 3 4 5 6 7 8 9 10 21 ...
landOtimB[indLA25b222,]

landOtimB$testStatus25mi <- rep('NA', nrow(landOtimB))
landOtimB$testStatus25mi[indLA25b222] <- 'Tested'

subset(landOtimB, landOtimB$INTSITE == '3325')
indLA25b3325 <- which((landOtimB$common %in% O3325ba25$spName) & (landOtimB$INTSITE == '3325'))
str(indLA25b3325)
 int [1:4] 12 13 122 217
landOtimB[indLA25b3325,]
landOtimB$testStatus25mi[indLA25b3325] <- 'Tested'

indLA25b306 <- which((landOtimB$common %in% O306ba25$spName) & (landOtimB$INTSITE == '306'))
str(indLA25b306)
 int [1:4] 88 89 152 153
landOtimB[indLA25b306,]
landOtimB$testStatus25mi[indLA25b306] <- 'Tested'

indLA25b159 <- which((landOtimB$common %in% O159ba25$spName) & (landOtimB$INTSITE == '159'))
str(indLA25b159)
 int [1:19] 1 66 75 77 79 81 90 99 100 101 ...
landOtimB[indLA25b159,]
landOtimB$testStatus25mi[indLA25b159] <- 'Tested'

indLA25b151 <- which((landOtimB$common %in% O151ba25$spName) & (landOtimB$INTSITE == '151'))
str(indLA25b151)
 int [1:6] 26 120 159 160 177 181
landOtimB[indLA25b151,]
landOtimB$testStatus25mi[indLA25b151] <- 'Tested'

landOtimB$testStatus25mi[landOtimB$testStatus25mi %in% 'NA'] <- 'Not Tested'

#top sites = 222, 159, 306, 3325, 151, within 100 mi
unique(mercLA100miBA$INTSITE)
[1] "151ba"  "159ba"  "222ba"  "306ba"  "3325ba"
str(mercLA25miBA)
Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 23 obs. of  6 variables:
 $ INTSITE: chr  "151ba" "151ba" "151ba" "151ba" ...
 $ spName : chr  "BLACK DRUM" "RED DRUM" "SHEEPSHEAD" "SOUTHERN FLOUNDER" ...
 $ n      : int  3 8 8 3 6 5 12 11 6 10 ...
 $ aveWt  : num  404 1756 993 467 445 ...
 $ aveLt  : num  193 53.2 37.1 33.6 35.8 ...
 $ aveHg  : num  0.0336 0.0753 0.054 0.0251 0.0667 ...
 - attr(*, "groups")=Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  5 obs. of  2 variables:
  ..$ INTSITE: chr  "151ba" "159ba" "222ba" "306ba" ...
  ..$ .rows  :List of 5
  .. ..$ : int  1 2 3 4 5
  .. ..$ : int  6 7 8 9 10
  .. ..$ : int  11 12 13 14 15
  .. ..$ : int  16 17 18 19 20
  .. ..$ : int  21 22 23
  ..- attr(*, ".drop")= logi TRUE
unique(mercLA100miBA$spName)
 [1] "BLACK DRUM"        "BLACKFIN TUNA"     "COBIA"             "GRAY SNAPPER"     
 [5] "GRAY TRIGGERFISH"  "KING MACKEREL"     "RED DRUM"          "RED SNAPPER"      
 [9] "SHEEPSHEAD"        "SOUTHERN FLOUNDER" "SPOTTED SEATROUT"  "STRIPED BASS"     
unique(landOtimB$INTSITE)
[1]  159  222 3325  151  306
O222ba100 <- subset(mercLA100miBA,mercLA100miBA$INTSITE == '222ba')
O3325ba100 <- subset(mercLA100miBA,mercLA100miBA$INTSITE == '3325ba')
O306ba100 <- subset(mercLA100miBA,mercLA100miBA$INTSITE == '306ba')
O159ba100 <- subset(mercLA100miBA,mercLA100miBA$INTSITE == '159ba')
O151ba100 <- subset(mercLA100miBA,mercLA100miBA$INTSITE == '151ba')

indLA100b222 <- which((landOtimB$common %in% O222ba100$spName) & (landOtimB$INTSITE == '222'))
str(indLA100b222)
 int [1:116] 2 3 4 5 6 7 8 9 10 21 ...
landOtimB[indLA100b222,]

landOtimB$testStatus100mi <- rep('NA', nrow(landOtimB))
landOtimB$testStatus100mi[indLA100b222] <- 'Tested'

subset(landOtimB, landOtimB$INTSITE == '3325')
indLA100b3325 <- which((landOtimB$common %in% O3325ba100$spName) & (landOtimB$INTSITE == '3325'))
str(indLA100b3325)
 int [1:4] 12 13 122 217
landOtimB[indLA100b3325,]
landOtimB$testStatus100mi[indLA100b3325] <- 'Tested'

indLA100b306 <- which((landOtimB$common %in% O306ba100$spName) & (landOtimB$INTSITE == '306'))
str(indLA100b306)
 int [1:4] 88 89 152 153
landOtimB[indLA100b306,]
landOtimB$testStatus100mi[indLA100b306] <- 'Tested'

indLA100b159 <- which((landOtimB$common %in% O159ba100$spName) & (landOtimB$INTSITE == '159'))
str(indLA100b159)
 int [1:19] 1 66 75 77 79 81 90 99 100 101 ...
landOtimB[indLA100b159,]
landOtimB$testStatus100mi[indLA100b159] <- 'Tested'

indLA100b151 <- which((landOtimB$common %in% O151ba100$spName) & (landOtimB$INTSITE == '151'))
str(indLA100b151)
 int [1:6] 26 120 159 160 177 181
landOtimB[indLA100b151,]
landOtimB$testStatus100mi[indLA100b151] <- 'Tested'

landOtimB$testStatus100mi[landOtimB$testStatus100mi %in% 'NA'] <- 'Not Tested'

unique(landOtimB$testStatus100mi)
[1] "Tested"     "Not Tested"
LAbaProp25mi <- landOtimB %>%
  group_by(INTSITE, testStatus25mi) %>%
  summarise(n_distinct(common), landings = sum(landing), biomass = sum(wgt_ab1))

LAbaProp100mi <- landOtimB %>%
  group_by(INTSITE, testStatus100mi) %>%
  summarise(n_distinct(common), landings = sum(landing), biomass = sum(wgt_ab1))

write.csv(LAbaProp25mi, "~/FUIteam/PydioData/env/data_outputs/LAbaProp25mi.csv")
write.csv(LAbaProp100mi, "~/FUIteam/PydioData/env/data_outputs/LAbaProp100mi.csv")

Now onto Florida

str(landTtimA)
'data.frame':   1622 obs. of  19 variables:
 $ YEAR           : chr  "2005" "2005" "2005" "2005" ...
 $ REG_RES        : int  7 7 7 7 7 7 7 7 7 7 ...
 $ ST_RES         : int  12 12 12 12 12 12 12 12 12 12 ...
 $ CNTY_RES       : int  103 103 103 103 103 103 103 103 103 57 ...
 $ ST             : chr  "12" "12" "12" "12" ...
 $ CNTY           : int  103 103 103 103 103 103 103 103 103 103 ...
 $ INTSITE        : int  615 770 615 615 615 770 770 769 769 769 ...
 $ MODE_F         : int  1 1 1 1 1 1 1 1 1 1 ...
 $ MODE_FX        : chr  "3" "3" "3" "3" ...
 $ ID_CODE        : chr  "1297920050326028" "1520920050324001" "1520920050317005" "1520920050317005" ...
 $ ZIP            : chr  "33710" "33706" "33708" "33708" ...
 $ common         : chr  "SPANISH MACKEREL" "SCALED SARDINE" "SPOTTED SEATROUT" "SILVER PERCH" ...
 $ WAVE           : int  2 2 2 2 2 1 1 1 1 1 ...
 $ SP_CODE        : num  8.85e+09 8.75e+09 8.84e+09 8.84e+09 8.84e+09 ...
 $ harv_d3        : num  0 0 3 10 0 0 0 0 0 0 ...
 $ wgt_ab1        : num  3.779 0.413 2.86 1.551 0.602 ...
 $ landing        : num  9.04 24 3 18.03 2.01 ...
 $ testStatus25mi : chr  "Tested" "Not Tested" "Not Tested" "Not Tested" ...
 $ testStatus100mi: chr  "Tested" "Not Tested" "Not Tested" "Not Tested" ...
str(mercFL25miA)
Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 67 obs. of  6 variables:
 $ INTSITE: num  615 615 615 615 615 615 615 615 615 615 ...
 $ Species: chr  "BULL SHARK" "COBIA" "GAG" "GRAY SNAPPER" ...
 $ n      : int  1 1 2 9 8 8 1 5 1 1 ...
 $ aveWt  : num  NaN NaN 6 2 1 5.75 NaN 2.2 2 3 ...
 $ aveLt  : num  2800 1279 714 528 393 ...
 $ aveHg  : num  1.9 0.8 0.48 0.323 0.124 ...
 - attr(*, "groups")=Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  5 obs. of  2 variables:
  ..$ INTSITE: num  615 632 742 769 770
  ..$ .rows  :List of 5
  .. ..$ : int  1 2 3 4 5 6 7 8 9 10 ...
  .. ..$ : int  14 15 16 17 18 19 20 21 22 23 ...
  .. ..$ : int  26 27 28 29 30 31 32 33 34 35 ...
  .. ..$ : int  38 39 40 41 42 43 44 45 46 47 ...
  .. ..$ : int  53 54 55 56 57 58 59 60 61 62 ...
  ..- attr(*, ".drop")= logi TRUE
str(mercFL100miA)
Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 110 obs. of  6 variables:
 $ INTSITE: num  615 615 615 615 615 615 615 615 615 615 ...
 $ Species: chr  "" "ATLANTIC SHARPNOSE SHARK" "BLACKTIP SHARK" "BONNETHEAD" ...
 $ n      : int  1 1 3 11 5 3 11 11 3 9 ...
 $ aveWt  : num  NaN 117 2530 3581 4648 ...
 $ aveLt  : num  3429 310 1115 916 2103 ...
 $ aveHg  : num  3.5 0.088 1.463 0.789 1.978 ...
 - attr(*, "groups")=Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  5 obs. of  2 variables:
  ..$ INTSITE: num  615 632 742 769 770
  ..$ .rows  :List of 5
  .. ..$ : int  1 2 3 4 5 6 7 8 9 10 ...
  .. ..$ : int  24 25 26 27 28 29 30 31 32 33 ...
  .. ..$ : int  45 46 47 48 49 50 51 52 53 54 ...
  .. ..$ : int  69 70 71 72 73 74 75 76 77 78 ...
  .. ..$ : int  90 91 92 93 94 95 96 97 98 99 ...
  ..- attr(*, ".drop")= logi TRUE
unique(mercFL25miA$Species)
 [1] "BULL SHARK"        "COBIA"             "GAG"               "GRAY SNAPPER"     
 [5] "GRAY TRIGGERFISH"  "GREATER AMBERJACK" "GULF FLOUNDER"     "KING MACKEREL"    
 [9] "LITTLE TUNNY"      "RED DRUM"          "RED GROUPER"       "SNOOK"            
[13] "SPANISH MACKEREL"  "LANE SNAPPER"      "VERMILION SNAPPER"
unique(mercFL100miA$Species)
 [1] ""                         "ATLANTIC SHARPNOSE SHARK" "BLACKTIP SHARK"          
 [4] "BONNETHEAD"               "BULL SHARK"               "COBIA"                   
 [7] "CREVALLE JACK"            "FLORIDA POMPANO"          "GAG"                     
[10] "GRAY SNAPPER"             "GRAY TRIGGERFISH"         "GREATER AMBERJACK"       
[13] "GULF FLOUNDER"            "KING MACKEREL"            "LANE SNAPPER"            
[16] "LEMON SHARK"              "LITTLE TUNNY"             "RED DRUM"                
[19] "RED GROUPER"              "SNOOK"                    "SOUTHERN KINGFISH"       
[22] "SPANISH MACKEREL"         "VERMILION SNAPPER"        "SPOTTED SEATROUT"        
#need to convert lower case to upper case for the two dataframes to be able search properly
mercFL25miA$Species <- toupper(mercFL25miA$Species)
mercFL25miA$Species <- trimws(mercFL25miA$Species, which = c("right"), whitespace = "[ \t\r\n]")

mercFL100miA$Species <- toupper(mercFL100miA$Species)
mercFL100miA$Species <- trimws(mercFL100miA$Species, which = c("right"), whitespace = "[ \t\r\n]")

#edit COMMON SNOOK in MRIP data to read SNOOK so they match
landTtimA$common <- gsub("COMMON SNOOK", "SNOOK", landTtimA$common)

#top sites = 770, 769, 632, 615, 742, within 25 mi
unique(mercFL25miA$INTSITE)
[1] 615 632 742 769 770
unique(landTtimA$INTSITE)
[1] 615 770 769 632 742
T615a25 <- subset(mercFL25miA,mercFL25miA$INTSITE == '615')
T632a25 <- subset(mercFL25miA,mercFL25miA$INTSITE == '632')
T742a25 <- subset(mercFL25miA,mercFL25miA$INTSITE == '742')
T769a25 <- subset(mercFL25miA,mercFL25miA$INTSITE == '769')
T770a25 <- subset(mercFL25miA,mercFL25miA$INTSITE == '770')

indFL25a615 <- which((landTtimA$common %in% T615a25$Species) & (landTtimA$INTSITE == '615'))
str(indFL25a615)
 int [1:42] 1 121 124 149 274 276 277 398 421 885 ...
landTtimA[indFL25a615,]
unique((subset(landTtimA,landTtimA$INTSITE == '615'))$common)
 [1] "SPANISH MACKEREL"         "SPOTTED SEATROUT"         "SILVER PERCH"            
 [4] "ATLANTIC CROAKER"         "FLORIDA POMPANO"          "GULF KINGFISH"           
 [7] "GRAY SNAPPER"             "SILVER SEATROUT"          "SOUTHERN KINGFISH"       
[10] "SCALED SARDINE"           "ATLANTIC BUMPER"          "LADYFISH"                
[13] "ATLANTIC THREAD HERRING"  "SPANISH SARDINE"          "PINFISH"                 
[16] "BLUEFISH"                 "MACKEREL GENUS"           "HOGFISH"                 
[19] "ATLANTIC SHARPNOSE SHARK" "BLUE RUNNER"              "WHITE GRUNT"             
[22] "GULF FLOUNDER"            "INSHORE LIZARDFISH"       "BLACK DRUM"              
[25] "SAND SEATROUT"            "PIGFISH"                  "SPOTTAIL PINFISH"        
[28] "SNOOK"                    "CREVALLE JACK"            "LEFTEYE FLOUNDER FAMILY" 
[31] "KINGFISH GENUS"           "RED DRUM"                 "SEATROUT GENUS"          
[34] "KING MACKEREL"           
unique(T615a25$Species)
 [1] "BULL SHARK"        "COBIA"             "GAG"               "GRAY SNAPPER"     
 [5] "GRAY TRIGGERFISH"  "GREATER AMBERJACK" "GULF FLOUNDER"     "KING MACKEREL"    
 [9] "LITTLE TUNNY"      "RED DRUM"          "RED GROUPER"       "SNOOK"            
[13] "SPANISH MACKEREL" 
landTtimA$testStatus25mi <- rep('NA', nrow(landTtimA))
landTtimA$testStatus25mi[indFL25a615] <- 'Tested'

indFL25a632 <- which((landTtimA$common %in% T632a25$Species) & (landTtimA$INTSITE == '632'))
str(indFL25a632)
 int [1:59] 75 134 137 139 192 348 349 358 359 360 ...
landTtimA[indFL25a632,]
unique(T632a25$Species)
 [1] "BULL SHARK"        "COBIA"             "GAG"               "GRAY SNAPPER"     
 [5] "GRAY TRIGGERFISH"  "GREATER AMBERJACK" "GULF FLOUNDER"     "LANE SNAPPER"     
 [9] "RED DRUM"          "SNOOK"             "SPANISH MACKEREL"  "VERMILION SNAPPER"
landTtimA$testStatus25mi[indFL25a632] <- 'Tested'

indFL25a742 <- which((landTtimA$common %in% T742a25$Species) & (landTtimA$INTSITE == '742'))
str(indFL25a742)
 int [1:15] 54 189 196 198 214 308 369 370 516 1048 ...
landTtimA[indFL25a742,]
landTtimA$testStatus25mi[indFL25a742] <- 'Tested'

indFL25a769 <- which((landTtimA$common %in% T769a25$Species) & (landTtimA$INTSITE == '769'))
str(indFL25a769)
 int [1:110] 111 112 113 114 115 116 117 118 119 120 ...
landTtimA[indFL25a769,]
landTtimA$testStatus25mi[indFL25a769] <- 'Tested'

indFL25a770 <- which((landTtimA$common %in% T770a25$Species) & (landTtimA$INTSITE == '770'))
str(indFL25a770)
 int [1:129] 21 25 30 32 33 34 39 40 41 42 ...
landTtimA[indFL25a770,]
landTtimA$testStatus25mi[indFL25a770] <- 'Tested'

landTtimA$testStatus25mi[landTtimA$testStatus25mi %in% 'NA'] <- 'Not Tested'

100 mi chunk for FL, time frame A

#top sites = 770, 769, 632, 615, 742, within 100 mi
unique(mercFL100miA$INTSITE)
[1] 615 632 742 769 770
unique(landTtimA$INTSITE)
[1] 615 770 769 632 742
T615a100 <- subset(mercFL100miA,mercFL100miA$INTSITE == '615')
T632a100 <- subset(mercFL100miA,mercFL100miA$INTSITE == '632')
T742a100 <- subset(mercFL100miA,mercFL100miA$INTSITE == '742')
T769a100 <- subset(mercFL100miA,mercFL100miA$INTSITE == '769')
T770a100 <- subset(mercFL100miA,mercFL100miA$INTSITE == '770')

indFL100a615 <- which((landTtimA$common %in% T615a100$Species) & (landTtimA$INTSITE == '615'))
str(indFL100a615)
 int [1:56] 1 121 122 124 149 258 261 274 276 277 ...
landTtimA[indFL100a615,]
unique((subset(landTtimA,landTtimA$INTSITE == '615'))$common)
 [1] "SPANISH MACKEREL"         "SPOTTED SEATROUT"         "SILVER PERCH"            
 [4] "ATLANTIC CROAKER"         "FLORIDA POMPANO"          "GULF KINGFISH"           
 [7] "GRAY SNAPPER"             "SILVER SEATROUT"          "SOUTHERN KINGFISH"       
[10] "SCALED SARDINE"           "ATLANTIC BUMPER"          "LADYFISH"                
[13] "ATLANTIC THREAD HERRING"  "SPANISH SARDINE"          "PINFISH"                 
[16] "BLUEFISH"                 "MACKEREL GENUS"           "HOGFISH"                 
[19] "ATLANTIC SHARPNOSE SHARK" "BLUE RUNNER"              "WHITE GRUNT"             
[22] "GULF FLOUNDER"            "INSHORE LIZARDFISH"       "BLACK DRUM"              
[25] "SAND SEATROUT"            "PIGFISH"                  "SPOTTAIL PINFISH"        
[28] "SNOOK"                    "CREVALLE JACK"            "LEFTEYE FLOUNDER FAMILY" 
[31] "KINGFISH GENUS"           "RED DRUM"                 "SEATROUT GENUS"          
[34] "KING MACKEREL"           
unique(T615a100$Species)
 [1] ""                         "ATLANTIC SHARPNOSE SHARK" "BLACKTIP SHARK"          
 [4] "BONNETHEAD"               "BULL SHARK"               "COBIA"                   
 [7] "CREVALLE JACK"            "FLORIDA POMPANO"          "GAG"                     
[10] "GRAY SNAPPER"             "GRAY TRIGGERFISH"         "GREATER AMBERJACK"       
[13] "GULF FLOUNDER"            "KING MACKEREL"            "LANE SNAPPER"            
[16] "LEMON SHARK"              "LITTLE TUNNY"             "RED DRUM"                
[19] "RED GROUPER"              "SNOOK"                    "SOUTHERN KINGFISH"       
[22] "SPANISH MACKEREL"         "VERMILION SNAPPER"       
landTtimA$testStatus100mi <- rep('NA', nrow(landTtimA))
landTtimA$testStatus100mi[indFL100a615] <- 'Tested'

indFL100a632 <- which((landTtimA$common %in% T632a100$Species) & (landTtimA$INTSITE == '632'))
str(indFL100a632)
 int [1:72] 75 133 134 136 137 139 192 346 347 348 ...
landTtimA[indFL100a632,]
unique(T632a100$Species)
 [1] ""                  "BLACKTIP SHARK"    "BONNETHEAD"        "BULL SHARK"       
 [5] "COBIA"             "FLORIDA POMPANO"   "GAG"               "GRAY SNAPPER"     
 [9] "GRAY TRIGGERFISH"  "GREATER AMBERJACK" "GULF FLOUNDER"     "KING MACKEREL"    
[13] "LANE SNAPPER"      "LEMON SHARK"       "LITTLE TUNNY"      "RED DRUM"         
[17] "RED GROUPER"       "SNOOK"             "SOUTHERN KINGFISH" "SPANISH MACKEREL" 
[21] "VERMILION SNAPPER"
landTtimA$testStatus100mi[indFL100a632] <- 'Tested'

indFL100a742 <- which((landTtimA$common %in% T742a100$Species) & (landTtimA$INTSITE == '742'))
str(indFL100a742)
 int [1:25] 24 54 126 128 185 189 194 196 198 214 ...
landTtimA[indFL100a742,]
landTtimA$testStatus100mi[indFL100a742] <- 'Tested'

indFL100a769 <- which((landTtimA$common %in% T769a100$Species) & (landTtimA$INTSITE == '769'))
str(indFL100a769)
 int [1:116] 12 111 112 113 114 115 116 117 118 119 ...
landTtimA[indFL100a769,]
landTtimA$testStatus100mi[indFL100a769] <- 'Tested'

indFL100a770 <- which((landTtimA$common %in% T770a100$Species) & (landTtimA$INTSITE == '770'))
str(indFL100a770)
 int [1:134] 21 25 30 32 33 34 39 40 41 42 ...
landTtimA[indFL100a770,]
landTtimA$testStatus100mi[indFL100a770] <- 'Tested'

landTtimA$testStatus100mi[landTtimA$testStatus100mi %in% 'NA'] <- 'Not Tested'

FLaProp25mi <- landTtimA %>%
  group_by(INTSITE, testStatus25mi) %>%
  summarise(n_distinct(common), landings = sum(landing), biomass = sum(wgt_ab1))

FLaProp100mi <- landTtimA %>%
  group_by(INTSITE, testStatus100mi) %>%
  summarise(n_distinct(common), landings = sum(landing), biomass = sum(wgt_ab1))

write.csv(FLaProp25mi, "~/FUIteam/PydioData/env/data_outputs/FLaProp25mi.csv")
write.csv(FLaProp100mi, "~/FUIteam/PydioData/env/data_outputs/FLaProp100mi.csv")

Timeframe B, 25 mi

str(landTtimB)
'data.frame':   956 obs. of  19 variables:
 $ YEAR           : chr  "2011" "2011" "2011" "2011" ...
 $ REG_RES        : int  7 7 7 7 7 7 7 7 7 7 ...
 $ ST_RES         : int  12 12 12 12 12 12 12 12 12 12 ...
 $ CNTY_RES       : int  103 57 57 57 57 57 57 57 57 57 ...
 $ ST             : chr  "12" "12" "12" "12" ...
 $ CNTY           : int  103 103 103 103 103 103 103 103 103 103 ...
 $ INTSITE        : int  770 769 769 769 769 769 769 769 769 769 ...
 $ MODE_F         : int  1 5 5 1 1 1 1 1 1 1 ...
 $ MODE_FX        : chr  "3" "3" "3" "3" ...
 $ ID_CODE        : chr  "1544320110218005" "1000920110227003" "1000920110227003" "1000920110227010" ...
 $ ZIP            : chr  "33778" "33547" "33547" "33612" ...
 $ common         : chr  "SPANISH MACKEREL" "SAND SEATROUT" "SPANISH MACKEREL" "SCALED SARDINE" ...
 $ WAVE           : int  1 1 1 1 1 1 1 1 1 1 ...
 $ SP_CODE        : num  8.85e+09 8.84e+09 8.85e+09 8.75e+09 8.84e+09 ...
 $ harv_d3        : num  1 0 0 0 0 0 0 0 0 0 ...
 $ wgt_ab1        : num  0.38 0.239 0.545 0.149 0.16 ...
 $ landing        : num  1 0.556 1.112 12 2 ...
 $ testStatus25mi : chr  "Tested" "Not Tested" "Tested" "Not Tested" ...
 $ testStatus100mi: chr  "Tested" "Not Tested" "Tested" "Not Tested" ...
str(mercFL25miB)
Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 70 obs. of  6 variables:
 $ INTSITE: chr  "3802b" "3802b" "3802b" "3802b" ...
 $ Species: chr  "Bull shark " "Cobia " "Gag " "Gray snapper " ...
 $ n      : int  1 2 3 9 8 12 1 5 1 1 ...
 $ aveWt  : num  NaN 7 4.5 2 1 ...
 $ aveLt  : num  2800 1120 687 528 393 ...
 $ aveHg  : num  1.9 0.72 0.493 0.323 0.124 ...
 - attr(*, "groups")=Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  5 obs. of  2 variables:
  ..$ INTSITE: chr  "3802b" "614b" "632b" "769b" ...
  ..$ .rows  :List of 5
  .. ..$ : int  1 2 3 4 5 6 7 8 9 10 ...
  .. ..$ : int  16 17 18 19 20 21 22 23 24 25 ...
  .. ..$ : int  29 30 31 32 33 34 35 36 37 38 ...
  .. ..$ : int  41 42 43 44 45 46 47 48 49 50 ...
  .. ..$ : int  56 57 58 59 60 61 62 63 64 65 ...
  ..- attr(*, ".drop")= logi TRUE
unique(mercFL25miB$Species)
 [1] "Bull shark "        "Cobia "             "Gag "               "Gray snapper "     
 [5] "Gray triggerfish "  "Greater amberjack " "Gulf flounder "     "King mackerel "    
 [9] "Lane snapper "      "Little tunny "      "Red drum "          "Red grouper "      
[13] "Snook "             "Spanish mackerel "  "Vermilion snapper "
#need to convert lower case to upper case for the two dataframes to be able search properly
mercFL25miB$Species <- toupper(mercFL25miB$Species)
mercFL25miB$Species <- trimws(mercFL25miB$Species, which = c("right"), whitespace = "[ \t\r\n]")

mercFL100miB$Species <- toupper(mercFL100miB$Species)
mercFL100miB$Species <- trimws(mercFL100miB$Species, which = c("right"), whitespace = "[ \t\r\n]")

#edit COMMON SNOOK in MRIP data to read SNOOK so they match
landTtimB$common <- gsub("COMMON SNOOK", "SNOOK", landTtimB$common)

#top sites = 770, 632, 3802, 769, 614, within 25 mi
unique(mercFL25miB$INTSITE)
[1] "3802b" "614b"  "632b"  "769b"  "770b" 
unique(landTtimB$INTSITE)
[1]  770  769  632  614 3802
T614b25 <- subset(mercFL25miB,mercFL25miB$INTSITE == '614b')
T632b25 <- subset(mercFL25miB,mercFL25miB$INTSITE == '632b')
T3802b25 <- subset(mercFL25miB,mercFL25miB$INTSITE == '3802b')
T769b25 <- subset(mercFL25miB,mercFL25miB$INTSITE == '769b')
T770b25 <- subset(mercFL25miB,mercFL25miB$INTSITE == '770b')

indFL25a614 <- which((landTtimB$common %in% T614b25$Species) & (landTtimB$INTSITE == '614'))
str(indFL25a614)
 int [1:5] 298 300 306 307 706
landTtimB[indFL25a614,]
unique((subset(landTtimB,landTtimB$INTSITE == '614'))$common)
 [1] "PINFISH"                  "SCALED SARDINE"           "LEATHERJACK"             
 [4] "SHEEPSHEAD"               "ATLANTIC SPADEFISH"       "STRIPED MULLET"          
 [7] "WHITE MULLET"             "SPANISH MACKEREL"         "ATLANTIC SHARPNOSE SHARK"
[10] "YELLOWFIN MENHADEN"       "ATLANTIC THREAD HERRING"  "GAFFTOPSAIL CATFISH"     
[13] "SOUTHERN KINGFISH"        "LADYFISH"                 "MOJARRA FAMILY"          
[16] "RED DRUM"                 "MULLET GENUS"             "FANTAIL MULLET"          
unique(T614b25$Species)
 [1] "BULL SHARK"        "COBIA"             "GAG"               "GRAY SNAPPER"     
 [5] "GRAY TRIGGERFISH"  "GREATER AMBERJACK" "GULF FLOUNDER"     "KING MACKEREL"    
 [9] "LITTLE TUNNY"      "RED DRUM"          "RED GROUPER"       "SNOOK"            
[13] "SPANISH MACKEREL" 
landTtimB$testStatus25mi <- rep('NA', nrow(landTtimB))
landTtimB$testStatus25mi[indFL25a614] <- 'Tested'

indFL25a632 <- which((landTtimB$common %in% T632b25$Species) & (landTtimB$INTSITE == '632'))
str(indFL25a632)
 int [1:60] 19 20 24 25 27 28 29 30 45 52 ...
landTtimB[indFL25a632,]
unique(T632b25$Species)
 [1] "BULL SHARK"        "COBIA"             "GAG"               "GRAY SNAPPER"     
 [5] "GRAY TRIGGERFISH"  "GREATER AMBERJACK" "GULF FLOUNDER"     "LANE SNAPPER"     
 [9] "RED DRUM"          "SNOOK"             "SPANISH MACKEREL"  "VERMILION SNAPPER"
landTtimB$testStatus25mi[indFL25a632] <- 'Tested'

indFL25a3802 <- which((landTtimB$common %in% T3802b25$Species) & (landTtimB$INTSITE == '3802'))
str(indFL25a3802)
 int [1:65] 386 387 389 397 508 513 514 515 545 550 ...
landTtimB[indFL25a3802,]
landTtimB$testStatus25mi[indFL25a3802] <- 'Tested'

indFL25a769 <- which((landTtimB$common %in% T769b25$Species) & (landTtimB$INTSITE == '769'))
str(indFL25a769)
 int [1:47] 3 6 14 16 117 122 174 212 225 226 ...
landTtimB[indFL25a769,]
landTtimB$testStatus25mi[indFL25a769] <- 'Tested'

indFL25a770 <- which((landTtimB$common %in% T770b25$Species) & (landTtimB$INTSITE == '770'))
str(indFL25a770)
 int [1:15] 1 74 108 109 146 205 206 331 332 335 ...
landTtimB[indFL25a770,]
landTtimB$testStatus25mi[indFL25a770] <- 'Tested'

landTtimB$testStatus25mi[landTtimB$testStatus25mi %in% 'NA'] <- 'Not Tested'

now 100 mi, timeframe B

#top sites = 770, 632, 3802, 769, 614, within 100 mi
unique(mercFL100miB$INTSITE)
[1] "3802b" "614b"  "632b"  "769b"  "770b" 
unique(landTtimB$INTSITE)
[1]  770  769  632  614 3802
T614b100 <- subset(mercFL100miB,mercFL100miB$INTSITE == '614b')
T632b100 <- subset(mercFL100miB,mercFL100miB$INTSITE == '632b')
T3802b100 <- subset(mercFL100miB,mercFL100miB$INTSITE == '3802b')
T769b100 <- subset(mercFL100miB,mercFL100miB$INTSITE == '769b')
T770b100 <- subset(mercFL100miB,mercFL100miB$INTSITE == '770b')

indFL100a614 <- which((landTtimB$common %in% T614b100$Species) & (landTtimB$INTSITE == '614'))
str(indFL100a614)
 int [1:7] 298 299 300 306 307 453 706
landTtimB[indFL100a614,]
unique((subset(landTtimB,landTtimB$INTSITE == '614'))$common)
 [1] "PINFISH"                  "SCALED SARDINE"           "LEATHERJACK"             
 [4] "SHEEPSHEAD"               "ATLANTIC SPADEFISH"       "STRIPED MULLET"          
 [7] "WHITE MULLET"             "SPANISH MACKEREL"         "ATLANTIC SHARPNOSE SHARK"
[10] "YELLOWFIN MENHADEN"       "ATLANTIC THREAD HERRING"  "GAFFTOPSAIL CATFISH"     
[13] "SOUTHERN KINGFISH"        "LADYFISH"                 "MOJARRA FAMILY"          
[16] "RED DRUM"                 "MULLET GENUS"             "FANTAIL MULLET"          
unique(T614b100$Species)
 [1] ""                         "ATLANTIC SHARPNOSE SHARK" "BLACKTIP SHARK"          
 [4] "BONNETHEAD"               "BULL SHARK"               "COBIA"                   
 [7] "CREVALLE JACK"            "FLORIDA POMPANO"          "GAG"                     
[10] "GRAY SNAPPER"             "GRAY TRIGGERFISH"         "GREATER AMBERJACK"       
[13] "GULF FLOUNDER"            "KING MACKEREL"            "LANE SNAPPER"            
[16] "LEMON SHARK"              "LITTLE TUNNY"             "RED DRUM"                
[19] "RED GROUPER"              "SNOOK"                    "SOUTHERN KINGFISH"       
[22] "SPANISH MACKEREL"         "VERMILION SNAPPER"       
landTtimB$testStatus100mi <- rep('NA', nrow(landTtimB))
landTtimB$testStatus100mi[indFL100a614] <- 'Tested'

indFL100a632 <- which((landTtimB$common %in% T632b100$Species) & (landTtimB$INTSITE == '632'))
str(indFL100a632)
 int [1:66] 19 20 24 25 27 28 29 30 45 52 ...
landTtimB[indFL100a632,]
unique(T632b100$Species)
 [1] ""                  "BLACKTIP SHARK"    "BONNETHEAD"        "BULL SHARK"       
 [5] "COBIA"             "FLORIDA POMPANO"   "GAG"               "GRAY SNAPPER"     
 [9] "GRAY TRIGGERFISH"  "GREATER AMBERJACK" "GULF FLOUNDER"     "KING MACKEREL"    
[13] "LANE SNAPPER"      "LEMON SHARK"       "LITTLE TUNNY"      "RED DRUM"         
[17] "RED GROUPER"       "SNOOK"             "SOUTHERN KINGFISH" "SPANISH MACKEREL" 
[21] "VERMILION SNAPPER"
landTtimB$testStatus100mi[indFL100a632] <- 'Tested'

indFL100a3802 <- which((landTtimB$common %in% T3802b100$Species) & (landTtimB$INTSITE == '3802'))
str(indFL100a3802)
 int [1:67] 386 387 389 397 508 513 514 515 545 550 ...
landTtimB[indFL100a3802,]
landTtimB$testStatus100mi[indFL100a3802] <- 'Tested'

indFL100a769 <- which((landTtimB$common %in% T769b100$Species) & (landTtimB$INTSITE == '769'))
str(indFL100a769)
 int [1:48] 3 6 14 16 117 122 174 212 225 226 ...
landTtimB[indFL100a769,]
unique((subset(landTtimB,landTtimB$INTSITE == '769'))$common)
 [1] "SAND SEATROUT"           "SPANISH MACKEREL"        "SCALED SARDINE"         
 [4] "PINFISH"                 "ATLANTIC THREAD HERRING" "SPOTTED SEATROUT"       
 [7] "WHITE GRUNT"             "PIGFISH"                 "CREVALLE JACK"          
[10] "BLACK SEA BASS"          "BLUE RUNNER"             "SPOTTAIL PINFISH"       
[13] "GULF FLOUNDER"           "GRAY SNAPPER"            "BLUEFISH"               
[16] "COWNOSE RAY"             "GAG"                     "SAND PERCH"             
[19] "ATLANTIC BUMPER"         "ATLANTIC CROAKER"        "SHEEPSHEAD"             
[22] "SEATROUT GENUS"          "LADYFISH"                "LITTLE TUNNY"           
[25] "LANE SNAPPER"            "SOUTHERN KINGFISH"       "SPANISH SARDINE"        
[28] "NORTHERN KINGFISH"      
unique(T769b100$Species)
 [1] ""                  "BLACKTIP SHARK"    "BONNETHEAD"        "BULL SHARK"       
 [5] "COBIA"             "FLORIDA POMPANO"   "GAG"               "GRAY SNAPPER"     
 [9] "GRAY TRIGGERFISH"  "GREATER AMBERJACK" "GULF FLOUNDER"     "KING MACKEREL"    
[13] "LANE SNAPPER"      "LEMON SHARK"       "LITTLE TUNNY"      "RED DRUM"         
[17] "RED GROUPER"       "SNOOK"             "SOUTHERN KINGFISH" "SPANISH MACKEREL" 
[21] "VERMILION SNAPPER"
landTtimB$testStatus100mi[indFL100a769] <- 'Tested'

indFL100a770 <- which((landTtimB$common %in% T770b100$Species) & (landTtimB$INTSITE == '770'))
str(indFL100a770)
 int [1:16] 1 74 108 109 139 146 205 206 331 332 ...
landTtimB[indFL100a770,]
landTtimB$testStatus100mi[indFL100a770] <- 'Tested'

landTtimB$testStatus100mi[landTtimB$testStatus100mi %in% 'NA'] <- 'Not Tested'

FLbProp25mi <- landTtimB %>%
  group_by(INTSITE, testStatus25mi) %>%
  summarise(n_distinct(common), landings = sum(landing), biomass = sum(wgt_ab1))

FLbProp100mi <- landTtimB %>%
  group_by(INTSITE, testStatus100mi) %>%
  summarise(n_distinct(common), landings = sum(landing), biomass = sum(wgt_ab1))

write.csv(FLbProp25mi, "~/FUIteam/PydioData/env/data_outputs/FLbProp25mi.csv")
write.csv(FLbProp100mi, "~/FUIteam/PydioData/env/data_outputs/FLbProp100mi.csv")

Size Comparison try it out, LA time frame A

Going to try this a different way, ignoring intsite but also removing duplicate mercury results. Will only use mercury samples from within 100 mi

On to FLorida!

landTtimAwt <- landTtimA
landTtimAwt$aveWt <- (landTtimAwt$wgt_ab1*1000)/landTtimAwt$landing #in g

str(DFfl100miA)
'data.frame':   938 obs. of  37 variables:
 $ Group         : int  121 120 120 120 120 120 120 120 120 120 ...
 $ Bottle        : chr  "TB04010" "ch0441" "ch0440" "TB04009" ...
 $ Location.x    : chr  "TBM" "chm" "chm" "TBX" ...
 $ Field_no      : chr  "TBM04110906" "chm04071102" "chm04071505" "TBX04062101?" ...
 $ Spec_no       : int  NA NA NA NA NA NA NA NA NA NA ...
 $ FIM_spec_no   : chr  "1" "2" "1" "1" ...
 $ Other_field_no: chr  "" "" "" "" ...
 $ Date          : int  20041104 20040712 20040709 20040621 20040616 20040616 20040615 20040613 20040613 20040613 ...
 $ New_date      : chr  "11/4/2004" "7/12/2004" "7/9/2004" "6/21/2004" ...
 $ Year          : int  2004 2004 2004 2004 2004 2004 2004 2004 2004 2004 ...
 $ Scfname       : chr  "Rachycentron canadum" "Sciaenops ocellatus" "Rachycentron canadum" "Carcharhinus leucas" ...
 $ Species       : chr  "Cobia " "Red drum " "Cobia " "Bull shark " ...
 $ NODCCODE      : num  8.84e+09 8.84e+09 8.84e+09 8.71e+09 8.84e+09 ...
 $ Sex           : chr  "F" "M" "F" "F" ...
 $ SL            : chr  "1030" "597" "1070" "." ...
 $ FL            : chr  "1122" "." "1170" "." ...
 $ TL            : chr  "1279" "704" "1335" "2800" ...
 $ Whole_weight  : chr  "." "." "20411.00" "." ...
 $ Zone          : chr  "b" "e" "a" "" ...
 $ Grid          : chr  "." "341" "15" "." ...
 $ Lat_deg       : chr  "." "26" "26" "." ...
 $ Lat_min       : chr  "." "29.374" "58.004" "." ...
 $ Site          : chr  "big bayou" "" "" "found at gandy ramp" ...
 $ Region.x      : chr  "MW" "" "" "MW" ...
 $ Hg            : num  0.8 0.22 1.5 1.9 0.26 0.23 0.35 3.1 3.5 1.9 ...
 $ Lat_Deg       : int  27 26 26 27 26 26 26 26 26 26 ...
 $ Lat_Min       : num  44.3 29.4 58 53.5 48.9 ...
 $ Lon           : int  82 82 82 82 82 82 82 82 82 82 ...
 $ Lon_Deg       : int  -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 ...
 $ Lon_Min       : num  38.38 10.14 11.17 31.98 9.01 ...
 $ Region.y      : chr  "TB" "CH" "CH" "MW" ...
 $ Location.y    : chr  "big bayou" "" "" "found at gandy ramp" ...
 $ LatDD         : num  27.7 26.5 27 27.9 26.8 ...
 $ LonDD         : num  -82.6 -82.2 -82.2 -82.5 -82.2 ...
 $ INTSITE       : num  770 770 770 770 770 770 770 770 770 770 ...
 $ LonDD.1       : num  136935 183158 181514 147519 185068 ...
 $ LatDD.1       : num  377392 238863 291732 394346 274897 ...
unique(DFfl100miA$INTSITE)
[1] 770 769 632 615 742
subDFfl100miA <- DFfl100miA[,1:34]
str(subDFfl100miA)
'data.frame':   938 obs. of  34 variables:
 $ Group         : int  121 120 120 120 120 120 120 120 120 120 ...
 $ Bottle        : chr  "TB04010" "ch0441" "ch0440" "TB04009" ...
 $ Location.x    : chr  "TBM" "chm" "chm" "TBX" ...
 $ Field_no      : chr  "TBM04110906" "chm04071102" "chm04071505" "TBX04062101?" ...
 $ Spec_no       : int  NA NA NA NA NA NA NA NA NA NA ...
 $ FIM_spec_no   : chr  "1" "2" "1" "1" ...
 $ Other_field_no: chr  "" "" "" "" ...
 $ Date          : int  20041104 20040712 20040709 20040621 20040616 20040616 20040615 20040613 20040613 20040613 ...
 $ New_date      : chr  "11/4/2004" "7/12/2004" "7/9/2004" "6/21/2004" ...
 $ Year          : int  2004 2004 2004 2004 2004 2004 2004 2004 2004 2004 ...
 $ Scfname       : chr  "Rachycentron canadum" "Sciaenops ocellatus" "Rachycentron canadum" "Carcharhinus leucas" ...
 $ Species       : chr  "Cobia " "Red drum " "Cobia " "Bull shark " ...
 $ NODCCODE      : num  8.84e+09 8.84e+09 8.84e+09 8.71e+09 8.84e+09 ...
 $ Sex           : chr  "F" "M" "F" "F" ...
 $ SL            : chr  "1030" "597" "1070" "." ...
 $ FL            : chr  "1122" "." "1170" "." ...
 $ TL            : chr  "1279" "704" "1335" "2800" ...
 $ Whole_weight  : chr  "." "." "20411.00" "." ...
 $ Zone          : chr  "b" "e" "a" "" ...
 $ Grid          : chr  "." "341" "15" "." ...
 $ Lat_deg       : chr  "." "26" "26" "." ...
 $ Lat_min       : chr  "." "29.374" "58.004" "." ...
 $ Site          : chr  "big bayou" "" "" "found at gandy ramp" ...
 $ Region.x      : chr  "MW" "" "" "MW" ...
 $ Hg            : num  0.8 0.22 1.5 1.9 0.26 0.23 0.35 3.1 3.5 1.9 ...
 $ Lat_Deg       : int  27 26 26 27 26 26 26 26 26 26 ...
 $ Lat_Min       : num  44.3 29.4 58 53.5 48.9 ...
 $ Lon           : int  82 82 82 82 82 82 82 82 82 82 ...
 $ Lon_Deg       : int  -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 ...
 $ Lon_Min       : num  38.38 10.14 11.17 31.98 9.01 ...
 $ Region.y      : chr  "TB" "CH" "CH" "MW" ...
 $ Location.y    : chr  "big bayou" "" "" "found at gandy ramp" ...
 $ LatDD         : num  27.7 26.5 27 27.9 26.8 ...
 $ LonDD         : num  -82.6 -82.2 -82.2 -82.5 -82.2 ...
meltDFfl100miA <- subDFfl100miA %>% distinct()
str(meltDFfl100miA)
'data.frame':   280 obs. of  34 variables:
 $ Group         : int  121 120 120 120 120 120 120 120 120 120 ...
 $ Bottle        : chr  "TB04010" "ch0441" "ch0440" "TB04009" ...
 $ Location.x    : chr  "TBM" "chm" "chm" "TBX" ...
 $ Field_no      : chr  "TBM04110906" "chm04071102" "chm04071505" "TBX04062101?" ...
 $ Spec_no       : int  NA NA NA NA NA NA NA NA NA NA ...
 $ FIM_spec_no   : chr  "1" "2" "1" "1" ...
 $ Other_field_no: chr  "" "" "" "" ...
 $ Date          : int  20041104 20040712 20040709 20040621 20040616 20040616 20040615 20040613 20040613 20040613 ...
 $ New_date      : chr  "11/4/2004" "7/12/2004" "7/9/2004" "6/21/2004" ...
 $ Year          : int  2004 2004 2004 2004 2004 2004 2004 2004 2004 2004 ...
 $ Scfname       : chr  "Rachycentron canadum" "Sciaenops ocellatus" "Rachycentron canadum" "Carcharhinus leucas" ...
 $ Species       : chr  "Cobia " "Red drum " "Cobia " "Bull shark " ...
 $ NODCCODE      : num  8.84e+09 8.84e+09 8.84e+09 8.71e+09 8.84e+09 ...
 $ Sex           : chr  "F" "M" "F" "F" ...
 $ SL            : chr  "1030" "597" "1070" "." ...
 $ FL            : chr  "1122" "." "1170" "." ...
 $ TL            : chr  "1279" "704" "1335" "2800" ...
 $ Whole_weight  : chr  "." "." "20411.00" "." ...
 $ Zone          : chr  "b" "e" "a" "" ...
 $ Grid          : chr  "." "341" "15" "." ...
 $ Lat_deg       : chr  "." "26" "26" "." ...
 $ Lat_min       : chr  "." "29.374" "58.004" "." ...
 $ Site          : chr  "big bayou" "" "" "found at gandy ramp" ...
 $ Region.x      : chr  "MW" "" "" "MW" ...
 $ Hg            : num  0.8 0.22 1.5 1.9 0.26 0.23 0.35 3.1 3.5 1.9 ...
 $ Lat_Deg       : int  27 26 26 27 26 26 26 26 26 26 ...
 $ Lat_Min       : num  44.3 29.4 58 53.5 48.9 ...
 $ Lon           : int  82 82 82 82 82 82 82 82 82 82 ...
 $ Lon_Deg       : int  -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 ...
 $ Lon_Min       : num  38.38 10.14 11.17 31.98 9.01 ...
 $ Region.y      : chr  "TB" "CH" "CH" "MW" ...
 $ Location.y    : chr  "big bayou" "" "" "found at gandy ramp" ...
 $ LatDD         : num  27.7 26.5 27 27.9 26.8 ...
 $ LonDD         : num  -82.6 -82.2 -82.2 -82.5 -82.2 ...
unique(meltDFfl100miA$Species)
 [1] "Cobia "                    "Red drum "                 "Bull shark "              
 [4] "Southern kingfish "        "Bonnethead "               "Blacktip shark "          
 [7] ""                          "Lemon shark "              "Florida pompano "         
[10] "Gulf flounder "            "Red grouper "              "Gag "                     
[13] "Snook "                    "Gray snapper "             "Spanish mackerel "        
[16] "King mackerel "            "Little tunny "             "Vermilion snapper "       
[19] "Lane snapper "             "Gray triggerfish "         "Greater amberjack "       
[22] "Crevalle jack "            "Atlantic sharpnose shark " "Spotted seatrout "        
#need to convert lower case to upper case for the two dataframes to be able search properly
meltDFfl100miA$Species <- toupper(meltDFfl100miA$Species)
meltDFfl100miA$Species <- trimws(meltDFfl100miA$Species, which = c("right"), whitespace = "[ \t\r\n]")

#now compare mrip to merc for time frame A in Louisiana
mripFLTestedA <- subset(landTtimAwt,landTtimAwt$testStatus100mi == 'Tested')
mercFLtestA <- meltDFfl100miA[meltDFfl100miA$Species %in% (unique(mripFLTestedA$common)),]
unique(mripFLTestedA$common)
 [1] "SPANISH MACKEREL"         "SOUTHERN KINGFISH"        "SPOTTED SEATROUT"        
 [4] "KING MACKEREL"            "FLORIDA POMPANO"          "GAG"                     
 [7] "GRAY SNAPPER"             "GULF FLOUNDER"            "CREVALLE JACK"           
[10] "RED DRUM"                 "LITTLE TUNNY"             "ATLANTIC SHARPNOSE SHARK"
[13] "LANE SNAPPER"             "RED GROUPER"              "SNOOK"                   
[16] "BONNETHEAD"               "GRAY TRIGGERFISH"        
unique(mercFLtestA$Species)
 [1] "RED DRUM"                 "SOUTHERN KINGFISH"        "BONNETHEAD"              
 [4] "FLORIDA POMPANO"          "GULF FLOUNDER"            "RED GROUPER"             
 [7] "GAG"                      "SNOOK"                    "GRAY SNAPPER"            
[10] "SPANISH MACKEREL"         "KING MACKEREL"            "LITTLE TUNNY"            
[13] "LANE SNAPPER"             "GRAY TRIGGERFISH"         "CREVALLE JACK"           
[16] "ATLANTIC SHARPNOSE SHARK" "SPOTTED SEATROUT"        
str(mripFLTestedA)
'data.frame':   403 obs. of  20 variables:
 $ YEAR           : chr  "2005" "2005" "2005" "2005" ...
 $ REG_RES        : int  7 7 7 7 7 7 7 7 7 7 ...
 $ ST_RES         : int  12 12 12 12 12 12 12 12 12 12 ...
 $ CNTY_RES       : int  103 103 57 103 103 103 57 57 103 57 ...
 $ ST             : chr  "12" "12" "12" "12" ...
 $ CNTY           : int  103 103 103 103 103 103 103 103 103 103 ...
 $ INTSITE        : int  615 769 770 742 770 770 770 770 770 770 ...
 $ MODE_F         : int  1 1 1 3 1 1 1 1 1 1 ...
 $ MODE_FX        : chr  "3" "3" "3" "3" ...
 $ ID_CODE        : chr  "1297920050326028" "1297920050106028" "1523120050430020" "1297920050111007" ...
 $ ZIP            : chr  "33710" "33705" "33611" "33759" ...
 $ common         : chr  "SPANISH MACKEREL" "SOUTHERN KINGFISH" "SPANISH MACKEREL" "SPOTTED SEATROUT" ...
 $ WAVE           : int  2 1 2 1 2 2 2 2 2 2 ...
 $ SP_CODE        : num  8.85e+09 8.84e+09 8.85e+09 8.84e+09 8.85e+09 ...
 $ harv_d3        : num  0 0 0 0 0 0 0 1 1 0 ...
 $ wgt_ab1        : num  3.779 1.147 0.585 0.803 2.277 ...
 $ landing        : num  9.04 4.02 1.01 1 6.01 ...
 $ testStatus25mi : chr  "Tested" "Not Tested" "Tested" "Not Tested" ...
 $ testStatus100mi: chr  "Tested" "Tested" "Tested" "Tested" ...
 $ aveWt          : num  418 285 580 800 379 ...
str(mercFLtestA)
'data.frame':   236 obs. of  34 variables:
 $ Group         : int  120 120 120 120 120 120 120 120 120 120 ...
 $ Bottle        : chr  "ch0441" "ch0438" "ch0439" "ch0437" ...
 $ Location.x    : chr  "chm" "chm" "chm" "chm" ...
 $ Field_no      : chr  "chm04071102" "chm04060303" "chm04061702" "chm04060504" ...
 $ Spec_no       : int  NA NA NA NA NA NA NA NA NA NA ...
 $ FIM_spec_no   : chr  "2" "1" "1" "1" ...
 $ Other_field_no: chr  "" "" "" "" ...
 $ Date          : int  20040712 20040616 20040616 20040615 20040608 20040526 20040520 20040520 20040520 20040504 ...
 $ New_date      : chr  "7/12/2004" "6/16/2004" "6/16/2004" "6/15/2004" ...
 $ Year          : int  2004 2004 2004 2004 2004 2004 2004 2004 2004 2004 ...
 $ Scfname       : chr  "Sciaenops ocellatus" "Sciaenops ocellatus" "Menticirrhus americanus" "Sphyrna tiburo" ...
 $ Species       : chr  "RED DRUM" "RED DRUM" "SOUTHERN KINGFISH" "BONNETHEAD" ...
 $ NODCCODE      : num  8.84e+09 8.84e+09 8.84e+09 8.71e+09 8.84e+09 ...
 $ Sex           : chr  "M" "F" "F" "M" ...
 $ SL            : chr  "597" "522" "220" "501" ...
 $ FL            : chr  "." "." "." "." ...
 $ TL            : chr  "704" "630" "260" "885" ...
 $ Whole_weight  : chr  "." "." "." "." ...
 $ Zone          : chr  "e" "a" "c" "b" ...
 $ Grid          : chr  "341" "104" "137" "118" ...
 $ Lat_deg       : chr  "26" "26" "26" "26" ...
 $ Lat_min       : chr  "29.374" "48.890" "46.743" "47.601" ...
 $ Site          : chr  "" "" "" "" ...
 $ Region.x      : chr  "" "" "" "" ...
 $ Hg            : num  0.22 0.26 0.23 0.35 0.23 0.15 0.12 0.15 0.14 0.12 ...
 $ Lat_Deg       : int  26 26 26 26 26 26 26 26 26 26 ...
 $ Lat_Min       : num  29.4 48.9 46.7 47.7 47.6 ...
 $ Lon           : int  82 82 82 82 82 82 82 82 82 82 ...
 $ Lon_Deg       : int  -82 -82 -82 -82 -82 -82 -82 -82 -82 -82 ...
 $ Lon_Min       : num  10.14 9.01 4.22 16.23 15.44 ...
 $ Region.y      : chr  "CH" "CH" "CH" "CH" ...
 $ Location.y    : chr  "" "" "" "" ...
 $ LatDD         : num  26.5 26.8 26.8 26.8 26.8 ...
 $ LonDD         : num  -82.2 -82.2 -82.1 -82.3 -82.3 ...
mercFLtestA
AsubFLmrip <- mripFLTestedA[,c(11:12,20)]
AsubFLmrip$source <- 'MRIP'
colnames(AsubFLmrip) <- c("ZIP", "spName", "aveWt_g","source")

AsubFLmerc <- mercFLtestA[,c(12,18)]
AsubFLmerc$source <- 'MERC'
AsubFLmerc$ZIP <- 'NA'
AsubFLmerc <- AsubFLmerc[,c("ZIP", "Species", "Whole_weight","source")]
colnames(AsubFLmerc) <- c("ZIP", "spName", "aveWt_g","source")

compFLa <- rbind(AsubFLmrip,AsubFLmerc)

ggplot(compFLa, aes(x=spName, y=aveWt_g, fill = source))  + 
  geom_boxplot() + 
  xlab("Species") + 
  ylab("Average Weight (g)") +
  theme(axis.text.x = element_text(size = 12, face = "bold", angle = 45, hjust = 1),
        axis.text.y = element_text(size = 12, face = "bold"),  
        axis.title.x = element_text(size = 16, face = "plain"),
        axis.title.y = element_text(size = 16, face = "plain")) + 
  theme(legend.text=element_text(size = 12, face = "plain"),
        legend.title=element_text(size = 14, face = "bold"))

#not enough observations of mercury weights to run
results.FLa <-ddply(compFLa,.(spName),function(x) summarize(x,
Pvalue=t.test(aveWt_g~source,data=x,na.rm=TRUE,paired=F)$p.value,
Estimate.MERC=t.test(aveWt_g~source,data=x,na.rm=TRUE,paired=F)$estimate[1],
Estimate.MRIP=t.test(aveWt_g~source,data=x,na.rm=TRUE,paired=F)$estimate[2]))
argument is not numeric or logical: returning NAError in t.test.default(x = "117.00", y = "2860", na.rm = TRUE, paired = FALSE) : 
  not enough 'x' observations

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHBseXIpCgojbWVyY3VyeSBkYXRhIGZyYW1lcwpERmZsMjVtaUEgPC0gYXMuZGF0YS5mcmFtZShmbDI1bWlBKQpERmZsMTAwbWlBIDwtIGFzLmRhdGEuZnJhbWUoZmwxMDBtaUEpCkRGZmwyNW1pQiA8LSBhcy5kYXRhLmZyYW1lKGZsMjVtaUIpCkRGZmwxMDBtaUIgPC0gYXMuZGF0YS5mcmFtZShmbDEwMG1pQikKREZsYTI1bWlBIDwtIGFzLmRhdGEuZnJhbWUobGEyNW1pQXN3KQpERmxhMTAwbWlBIDwtIGFzLmRhdGEuZnJhbWUobGExMDBtaUFzdykKREZsYTI1bWlCQSA8LSBhcy5kYXRhLmZyYW1lKGxhMjVtaUJBc3cpCkRGbGExMDBtaUJBIDwtIGFzLmRhdGEuZnJhbWUobGExMDBtaUJBc3cpCgojcmVsZXZhbnQgbXJpcCBkYXRhCmxhbmRPdGltQQpsYW5kT3RpbUIKbGFuZFR0aW1BCmxhbmRUdGltQgoKYGBge3J9CiNpc29sYXRlIHNwZWNpZXMsIGJpb21hc3MsIGxhbmRpbmdzLCBwZXIgc2l0ZSAtIEZMb3JpZGEKCkRGZmwyNW1pQSRXaG9sZV93ZWlnaHQgPC0gYXMubnVtZXJpYyhERmZsMjVtaUEkV2hvbGVfd2VpZ2h0KQpERmZsMjVtaUEkVEwgPC0gYXMubnVtZXJpYyhERmZsMjVtaUEkVEwpCgpzdHIoREZmbDI1bWlBKQoKbWVyY0ZMMjVtaUEgPC0gREZmbDI1bWlBICU+JSAKICBncm91cF9ieShJTlRTSVRFLFNwZWNpZXMpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSwgYXZlV3QgPSBtZWFuKFdob2xlX3dlaWdodCwgbmEucm0gPSBUUlVFKSwgCiAgICAgICAgICAgIGF2ZUx0ID0gbWVhbihUTCwgbmEucm0gPSBUUlVFKSwgYXZlSGcgPSBtZWFuKEhnLCBuYS5ybSA9IFRSVUUpKQoKbWVyY0ZMMjVtaUEgCgpERmZsMTAwbWlBJFdob2xlX3dlaWdodCA8LSBhcy5udW1lcmljKERGZmwxMDBtaUEkV2hvbGVfd2VpZ2h0KQpERmZsMTAwbWlBJFRMIDwtIGFzLm51bWVyaWMoREZmbDEwMG1pQSRUTCkKCm1lcmNGTDEwMG1pQSA8LSBERmZsMTAwbWlBICU+JSAKICBncm91cF9ieShJTlRTSVRFLFNwZWNpZXMpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSwgYXZlV3QgPSBtZWFuKFdob2xlX3dlaWdodCwgbmEucm0gPSBUUlVFKSwgCiAgICAgICAgICAgIGF2ZUx0ID0gbWVhbihUTCwgbmEucm0gPSBUUlVFKSwgYXZlSGcgPSBtZWFuKEhnLCBuYS5ybSA9IFRSVUUpKQoKbWVyY0ZMMTAwbWlBIAoKREZmbDI1bWlCJFdob2xlX3dlaWdodCA8LSBhcy5udW1lcmljKERGZmwyNW1pQiRXaG9sZV93ZWlnaHQpCkRGZmwyNW1pQiRUTCA8LSBhcy5udW1lcmljKERGZmwyNW1pQiRUTCkKCm1lcmNGTDI1bWlCIDwtIERGZmwyNW1pQiAlPiUgCiAgZ3JvdXBfYnkoSU5UU0lURSxTcGVjaWVzKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCksIGF2ZVd0ID0gbWVhbihXaG9sZV93ZWlnaHQsIG5hLnJtID0gVFJVRSksIAogICAgICAgICAgICBhdmVMdCA9IG1lYW4oVEwsIG5hLnJtID0gVFJVRSksIGF2ZUhnID0gbWVhbihIZywgbmEucm0gPSBUUlVFKSkKCm1lcmNGTDI1bWlCIAoKREZmbDEwMG1pQiRXaG9sZV93ZWlnaHQgPC0gYXMubnVtZXJpYyhERmZsMTAwbWlCJFdob2xlX3dlaWdodCkKREZmbDEwMG1pQiRUTCA8LSBhcy5udW1lcmljKERGZmwxMDBtaUIkVEwpCgptZXJjRkwxMDBtaUIgPC0gREZmbDEwMG1pQiAlPiUgCiAgZ3JvdXBfYnkoSU5UU0lURSxTcGVjaWVzKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCksIGF2ZVd0ID0gbWVhbihXaG9sZV93ZWlnaHQsIG5hLnJtID0gVFJVRSksIAogICAgICAgICAgICBhdmVMdCA9IG1lYW4oVEwsIG5hLnJtID0gVFJVRSksIGF2ZUhnID0gbWVhbihIZywgbmEucm0gPSBUUlVFKSkKCm1lcmNGTDEwMG1pQiAKCiNNUklQCmxhbmRUdGltQQpsYW5kVHRpbUIKCm1yaXBGTGEgPC0gbGFuZFR0aW1BICU+JSAKICBncm91cF9ieShJTlRTSVRFLGNvbW1vbikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpLCBsYW5kaW5ncyA9IHN1bShsYW5kaW5nKSwgYmlvbWFzcyA9IHN1bSh3Z3RfYWIxLCBuYS5ybSA9IFRSVUUpKQptcmlwRkxhCgptcmlwRkxiIDwtIGxhbmRUdGltQiAlPiUgCiAgZ3JvdXBfYnkoSU5UU0lURSxjb21tb24pICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSwgbGFuZGluZ3MgPSBzdW0obGFuZGluZyksIGJpb21hc3MgPSBzdW0od2d0X2FiMSwgbmEucm0gPSBUUlVFKSkKbXJpcEZMYgpgYGAKCkFkZCBpbiBOT0xBCgpgYGB7cn0Kc3RyKERGbGEyNW1pQSkKCm1lcmNMQTI1bWlBIDwtIERGbGEyNW1pQSAlPiUgCiAgZ3JvdXBfYnkoSU5UU0lURSxzcE5hbWUpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSwgYXZlV3QgPSBtZWFuKGF2ZVd0X2csIG5hLnJtID0gVFJVRSksIAogICAgICAgICAgICBhdmVMdCA9IG1lYW4oYXZlTGVuX2NtLCBuYS5ybSA9IFRSVUUpLCBhdmVIZyA9IG1lYW4oSGdSZXN1bHQsIG5hLnJtID0gVFJVRSkpCm1lcmNMQTI1bWlBIAoKbWVyY0xBMTAwbWlBIDwtIERGbGExMDBtaUEgJT4lIAogIGdyb3VwX2J5KElOVFNJVEUsc3BOYW1lKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCksIGF2ZVd0ID0gbWVhbihhdmVXdF9nLCBuYS5ybSA9IFRSVUUpLCAKICAgICAgICAgICAgYXZlTHQgPSBtZWFuKGF2ZUxlbl9jbSwgbmEucm0gPSBUUlVFKSwgYXZlSGcgPSBtZWFuKEhnUmVzdWx0LCBuYS5ybSA9IFRSVUUpKQptZXJjTEExMDBtaUEgCgptZXJjTEEyNW1pQkEgPC0gREZsYTI1bWlCQSAlPiUgCiAgZ3JvdXBfYnkoSU5UU0lURSxzcE5hbWUpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSwgYXZlV3QgPSBtZWFuKGF2ZVd0X2csIG5hLnJtID0gVFJVRSksIAogICAgICAgICAgICBhdmVMdCA9IG1lYW4oYXZlTGVuX2NtLCBuYS5ybSA9IFRSVUUpLCBhdmVIZyA9IG1lYW4oSGdSZXN1bHQsIG5hLnJtID0gVFJVRSkpCm1lcmNMQTI1bWlCQSAKCm1lcmNMQTEwMG1pQkEgPC0gREZsYTEwMG1pQkEgJT4lIAogIGdyb3VwX2J5KElOVFNJVEUsc3BOYW1lKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCksIGF2ZVd0ID0gbWVhbihhdmVXdF9nLCBuYS5ybSA9IFRSVUUpLCAKICAgICAgICAgICAgYXZlTHQgPSBtZWFuKGF2ZUxlbl9jbSwgbmEucm0gPSBUUlVFKSwgYXZlSGcgPSBtZWFuKEhnUmVzdWx0LCBuYS5ybSA9IFRSVUUpKQptZXJjTEExMDBtaUJBIAoKI01SSVAKbXJpcExBYSA8LSBsYW5kT3RpbUEgJT4lIAogIGdyb3VwX2J5KElOVFNJVEUsY29tbW9uKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCksIGxhbmRpbmdzID0gc3VtKGxhbmRpbmcpLCBiaW9tYXNzID0gc3VtKHdndF9hYjEsIG5hLnJtID0gVFJVRSkpCm1yaXBMQWEKCm1yaXBMQWIgPC0gbGFuZE90aW1CICU+JSAKICBncm91cF9ieShJTlRTSVRFLGNvbW1vbikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpLCBsYW5kaW5ncyA9IHN1bShsYW5kaW5nKSwgYmlvbWFzcyA9IHN1bSh3Z3RfYWIxLCBuYS5ybSA9IFRSVUUpKQptcmlwTEFiCgpgYGAKVHJ5IHRvIGluZGljYXRlIHdoaWNoIGVudHJpZXMgYXJlIHRlc3RlZCBpbiBtcmlwCgpgYGB7cn0Kc3RyKGxhbmRPdGltQSkKc3RyKG1lcmNMQTI1bWlBKQp1bmlxdWUobWVyY0xBMjVtaUEkc3BOYW1lKQoKI3RvcCBzaXRlcyA9IDIyMiwgMjMxLCAzMDYsIDE1NSwgMTUxLCB3aXRoaW4gMjUgbWkKdW5pcXVlKG1lcmNMQTI1bWlBJElOVFNJVEUpCnVuaXF1ZShsYW5kT3RpbUEkSU5UU0lURSkKTzIyMmEyNSA8LSBzdWJzZXQobWVyY0xBMjVtaUEsbWVyY0xBMjVtaUEkSU5UU0lURSA9PSAnMjIyJykKTzIzMWEyNSA8LSBzdWJzZXQobWVyY0xBMjVtaUEsbWVyY0xBMjVtaUEkSU5UU0lURSA9PSAnMjMxJykKTzMwNmEyNSA8LSBzdWJzZXQobWVyY0xBMjVtaUEsbWVyY0xBMjVtaUEkSU5UU0lURSA9PSAnMzA2JykKTzE1NWEyNSA8LSBzdWJzZXQobWVyY0xBMjVtaUEsbWVyY0xBMjVtaUEkSU5UU0lURSA9PSAnMTU1JykKTzE1MWEyNSA8LSBzdWJzZXQobWVyY0xBMjVtaUEsbWVyY0xBMjVtaUEkSU5UU0lURSA9PSAnMTUxJykKCmluZExBMjVhMjIyIDwtIHdoaWNoKChsYW5kT3RpbUEkY29tbW9uICVpbiUgTzIyMmEyNSRzcE5hbWUpICYgKGxhbmRPdGltQSRJTlRTSVRFID09ICcyMjInKSkKc3RyKGluZExBMjVhMjIyKQpsYW5kT3RpbUFbaW5kTEEyNWEyMjIsXQoKbGFuZE90aW1BJHRlc3RTdGF0dXMyNW1pIDwtIHJlcCgnTkEnLCBucm93KGxhbmRPdGltQSkpCmxhbmRPdGltQSR0ZXN0U3RhdHVzMjVtaVtpbmRMQTI1YTIyMl0gPC0gJ1Rlc3RlZCcKCmluZExBMjVhMjMxIDwtIHdoaWNoKChsYW5kT3RpbUEkY29tbW9uICVpbiUgTzIzMWEyNSRzcE5hbWUpICYgKGxhbmRPdGltQSRJTlRTSVRFID09ICcyMzEnKSkKc3RyKGluZExBMjVhMjMxKQpsYW5kT3RpbUFbaW5kTEEyNWEyMzEsXQpsYW5kT3RpbUEkdGVzdFN0YXR1czI1bWlbaW5kTEEyNWEyMzFdIDwtICdUZXN0ZWQnCgppbmRMQTI1YTMwNiA8LSB3aGljaCgobGFuZE90aW1BJGNvbW1vbiAlaW4lIE8zMDZhMjUkc3BOYW1lKSAmIChsYW5kT3RpbUEkSU5UU0lURSA9PSAnMzA2JykpCnN0cihpbmRMQTI1YTMwNikKbGFuZE90aW1BW2luZExBMjVhMzA2LF0KbGFuZE90aW1BJHRlc3RTdGF0dXMyNW1pW2luZExBMjVhMzA2XSA8LSAnVGVzdGVkJwoKaW5kTEEyNWExNTUgPC0gd2hpY2goKGxhbmRPdGltQSRjb21tb24gJWluJSBPMTU1YTI1JHNwTmFtZSkgJiAobGFuZE90aW1BJElOVFNJVEUgPT0gJzE1NScpKQpzdHIoaW5kTEEyNWExNTUpCmxhbmRPdGltQVtpbmRMQTI1YTE1NSxdCmxhbmRPdGltQSR0ZXN0U3RhdHVzMjVtaVtpbmRMQTI1YTE1NV0gPC0gJ1Rlc3RlZCcKCmluZExBMjVhMTUxIDwtIHdoaWNoKChsYW5kT3RpbUEkY29tbW9uICVpbiUgTzE1MWEyNSRzcE5hbWUpICYgKGxhbmRPdGltQSRJTlRTSVRFID09ICcxNTEnKSkKc3RyKGluZExBMjVhMTUxKQpsYW5kT3RpbUFbaW5kTEEyNWExNTEsXQpsYW5kT3RpbUEkdGVzdFN0YXR1czI1bWlbaW5kTEEyNWExNTFdIDwtICdUZXN0ZWQnCgpsYW5kT3RpbUEkdGVzdFN0YXR1czI1bWlbbGFuZE90aW1BJHRlc3RTdGF0dXMyNW1pICVpbiUgJ05BJ10gPC0gJ05vdCBUZXN0ZWQnCgojdG9wIHNpdGVzID0gMjIyLCAyMzEsIDMwNiwgMTU1LCAxNTEsIHdpdGhpbiAxMDAgbWkKdW5pcXVlKG1lcmNMQTEwMG1pQSRJTlRTSVRFKQp1bmlxdWUobWVyY0xBMTAwbWlBJHNwTmFtZSkKdW5pcXVlKGxhbmRPdGltQSRJTlRTSVRFKQpPMjIyYTEwMCA8LSBzdWJzZXQobWVyY0xBMTAwbWlBLG1lcmNMQTEwMG1pQSRJTlRTSVRFID09ICcyMjInKQpPMjMxYTEwMCA8LSBzdWJzZXQobWVyY0xBMTAwbWlBLG1lcmNMQTEwMG1pQSRJTlRTSVRFID09ICcyMzEnKQpPMzA2YTEwMCA8LSBzdWJzZXQobWVyY0xBMTAwbWlBLG1lcmNMQTEwMG1pQSRJTlRTSVRFID09ICczMDYnKQpPMTU1YTEwMCA8LSBzdWJzZXQobWVyY0xBMTAwbWlBLG1lcmNMQTEwMG1pQSRJTlRTSVRFID09ICcxNTUnKQpPMTUxYTEwMCA8LSBzdWJzZXQobWVyY0xBMTAwbWlBLG1lcmNMQTEwMG1pQSRJTlRTSVRFID09ICcxNTEnKQoKaW5kTEExMDBhMjIyIDwtIHdoaWNoKChsYW5kT3RpbUEkY29tbW9uICVpbiUgTzIyMmExMDAkc3BOYW1lKSAmIChsYW5kT3RpbUEkSU5UU0lURSA9PSAnMjIyJykpCnN0cihpbmRMQTEwMGEyMjIpCmxhbmRPdGltQVtpbmRMQTEwMGEyMjIsXQoKbGFuZE90aW1BJHRlc3RTdGF0dXMxMDBtaSA8LSByZXAoJ05BJywgbnJvdyhsYW5kT3RpbUEpKQpsYW5kT3RpbUEkdGVzdFN0YXR1czEwMG1pW2luZExBMTAwYTIyMl0gPC0gJ1Rlc3RlZCcKCmluZExBMTAwYTIzMSA8LSB3aGljaCgobGFuZE90aW1BJGNvbW1vbiAlaW4lIE8yMzFhMTAwJHNwTmFtZSkgJiAobGFuZE90aW1BJElOVFNJVEUgPT0gJzIzMScpKQpzdHIoaW5kTEExMDBhMjMxKQpsYW5kT3RpbUFbaW5kTEExMDBhMjMxLF0KbGFuZE90aW1BJHRlc3RTdGF0dXMxMDBtaVtpbmRMQTEwMGEyMzFdIDwtICdUZXN0ZWQnCgppbmRMQTEwMGEzMDYgPC0gd2hpY2goKGxhbmRPdGltQSRjb21tb24gJWluJSBPMzA2YTEwMCRzcE5hbWUpICYgKGxhbmRPdGltQSRJTlRTSVRFID09ICczMDYnKSkKc3RyKGluZExBMTAwYTMwNikKbGFuZE90aW1BW2luZExBMTAwYTMwNixdCmxhbmRPdGltQSR0ZXN0U3RhdHVzMTAwbWlbaW5kTEExMDBhMzA2XSA8LSAnVGVzdGVkJwoKaW5kTEExMDBhMTU1IDwtIHdoaWNoKChsYW5kT3RpbUEkY29tbW9uICVpbiUgTzE1NWExMDAkc3BOYW1lKSAmIChsYW5kT3RpbUEkSU5UU0lURSA9PSAnMTU1JykpCnN0cihpbmRMQTEwMGExNTUpCmxhbmRPdGltQVtpbmRMQTEwMGExNTUsXQpsYW5kT3RpbUEkdGVzdFN0YXR1czEwMG1pW2luZExBMTAwYTE1NV0gPC0gJ1Rlc3RlZCcKCmluZExBMTAwYTE1MSA8LSB3aGljaCgobGFuZE90aW1BJGNvbW1vbiAlaW4lIE8xNTFhMTAwJHNwTmFtZSkgJiAobGFuZE90aW1BJElOVFNJVEUgPT0gJzE1MScpKQpzdHIoaW5kTEExMDBhMTUxKQpsYW5kT3RpbUFbaW5kTEExMDBhMTUxLF0KbGFuZE90aW1BJHRlc3RTdGF0dXMxMDBtaVtpbmRMQTEwMGExNTFdIDwtICdUZXN0ZWQnCgpsYW5kT3RpbUEkdGVzdFN0YXR1czEwMG1pW2xhbmRPdGltQSR0ZXN0U3RhdHVzMTAwbWkgJWluJSAnTkEnXSA8LSAnTm90IFRlc3RlZCcKCmxhbmRPdGltQQoKTEFhUHJvcDI1bWkgPC0gbGFuZE90aW1BICU+JQogIGdyb3VwX2J5KElOVFNJVEUsIHRlc3RTdGF0dXMyNW1pKSAlPiUKICBzdW1tYXJpc2Uobl9kaXN0aW5jdChjb21tb24pLCBsYW5kaW5ncyA9IHN1bShsYW5kaW5nKSwgYmlvbWFzcyA9IHN1bSh3Z3RfYWIxKSkKCkxBYVByb3AxMDBtaSA8LSBsYW5kT3RpbUEgJT4lCiAgZ3JvdXBfYnkoSU5UU0lURSwgdGVzdFN0YXR1czEwMG1pKSAlPiUKICBzdW1tYXJpc2Uobl9kaXN0aW5jdChjb21tb24pLCBsYW5kaW5ncyA9IHN1bShsYW5kaW5nKSwgYmlvbWFzcyA9IHN1bSh3Z3RfYWIxKSkKCndyaXRlLmNzdihMQWFQcm9wMjVtaSwgIn4vRlVJdGVhbS9QeWRpb0RhdGEvZW52L2RhdGFfb3V0cHV0cy9MQWFQcm9wMjVtaS5jc3YiKQp3cml0ZS5jc3YoTEFhUHJvcDEwMG1pLCAifi9GVUl0ZWFtL1B5ZGlvRGF0YS9lbnYvZGF0YV9vdXRwdXRzL0xBYVByb3AxMDBtaS5jc3YiKQpgYGAKCk5ldyBPcmxlYW5zIFRpbWUgQ2h1bmsgQgoKYGBge3J9CnN0cihsYW5kT3RpbUIpCnN0cihtZXJjTEEyNW1pQkEpCnVuaXF1ZShtZXJjTEEyNW1pQkEkc3BOYW1lKQpzdHIobWVyY0xBMjVtaUEpCnN0cihtZXJjTEExMDBtaUEpCnVuaXF1ZShtZXJjTEEyNW1pQkEkc3BOYW1lKQp1bmlxdWUobWVyY0xBMTAwbWlCQSRzcE5hbWUpCnVuaXF1ZShsYW5kT3RpbUIkY29tbW9uKQoKI3RvcCBzaXRlcyA9IDIyMiwgMTU5LCAzMDYsIDMzMjUsIDE1MSwgd2l0aGluIDI1IG1pCnVuaXF1ZShtZXJjTEEyNW1pQkEkSU5UU0lURSkKdW5pcXVlKGxhbmRPdGltQiRJTlRTSVRFKQpPMjIyYmEyNSA8LSBzdWJzZXQobWVyY0xBMjVtaUJBLG1lcmNMQTI1bWlCQSRJTlRTSVRFID09ICcyMjJiYScpCk8zMzI1YmEyNSA8LSBzdWJzZXQobWVyY0xBMjVtaUJBLG1lcmNMQTI1bWlCQSRJTlRTSVRFID09ICczMzI1YmEnKQpPMzA2YmEyNSA8LSBzdWJzZXQobWVyY0xBMjVtaUJBLG1lcmNMQTI1bWlCQSRJTlRTSVRFID09ICczMDZiYScpCk8xNTliYTI1IDwtIHN1YnNldChtZXJjTEEyNW1pQkEsbWVyY0xBMjVtaUJBJElOVFNJVEUgPT0gJzE1OWJhJykKTzE1MWJhMjUgPC0gc3Vic2V0KG1lcmNMQTI1bWlCQSxtZXJjTEEyNW1pQkEkSU5UU0lURSA9PSAnMTUxYmEnKQoKaW5kTEEyNWIyMjIgPC0gd2hpY2goKGxhbmRPdGltQiRjb21tb24gJWluJSBPMjIyYmEyNSRzcE5hbWUpICYgKGxhbmRPdGltQiRJTlRTSVRFID09ICcyMjInKSkKc3RyKGluZExBMjViMjIyKQpsYW5kT3RpbUJbaW5kTEEyNWIyMjIsXQoKbGFuZE90aW1CJHRlc3RTdGF0dXMyNW1pIDwtIHJlcCgnTkEnLCBucm93KGxhbmRPdGltQikpCmxhbmRPdGltQiR0ZXN0U3RhdHVzMjVtaVtpbmRMQTI1YjIyMl0gPC0gJ1Rlc3RlZCcKCnN1YnNldChsYW5kT3RpbUIsIGxhbmRPdGltQiRJTlRTSVRFID09ICczMzI1JykKaW5kTEEyNWIzMzI1IDwtIHdoaWNoKChsYW5kT3RpbUIkY29tbW9uICVpbiUgTzMzMjViYTI1JHNwTmFtZSkgJiAobGFuZE90aW1CJElOVFNJVEUgPT0gJzMzMjUnKSkKc3RyKGluZExBMjViMzMyNSkKbGFuZE90aW1CW2luZExBMjViMzMyNSxdCmxhbmRPdGltQiR0ZXN0U3RhdHVzMjVtaVtpbmRMQTI1YjMzMjVdIDwtICdUZXN0ZWQnCgppbmRMQTI1YjMwNiA8LSB3aGljaCgobGFuZE90aW1CJGNvbW1vbiAlaW4lIE8zMDZiYTI1JHNwTmFtZSkgJiAobGFuZE90aW1CJElOVFNJVEUgPT0gJzMwNicpKQpzdHIoaW5kTEEyNWIzMDYpCmxhbmRPdGltQltpbmRMQTI1YjMwNixdCmxhbmRPdGltQiR0ZXN0U3RhdHVzMjVtaVtpbmRMQTI1YjMwNl0gPC0gJ1Rlc3RlZCcKCmluZExBMjViMTU5IDwtIHdoaWNoKChsYW5kT3RpbUIkY29tbW9uICVpbiUgTzE1OWJhMjUkc3BOYW1lKSAmIChsYW5kT3RpbUIkSU5UU0lURSA9PSAnMTU5JykpCnN0cihpbmRMQTI1YjE1OSkKbGFuZE90aW1CW2luZExBMjViMTU5LF0KbGFuZE90aW1CJHRlc3RTdGF0dXMyNW1pW2luZExBMjViMTU5XSA8LSAnVGVzdGVkJwoKaW5kTEEyNWIxNTEgPC0gd2hpY2goKGxhbmRPdGltQiRjb21tb24gJWluJSBPMTUxYmEyNSRzcE5hbWUpICYgKGxhbmRPdGltQiRJTlRTSVRFID09ICcxNTEnKSkKc3RyKGluZExBMjViMTUxKQpsYW5kT3RpbUJbaW5kTEEyNWIxNTEsXQpsYW5kT3RpbUIkdGVzdFN0YXR1czI1bWlbaW5kTEEyNWIxNTFdIDwtICdUZXN0ZWQnCgpsYW5kT3RpbUIkdGVzdFN0YXR1czI1bWlbbGFuZE90aW1CJHRlc3RTdGF0dXMyNW1pICVpbiUgJ05BJ10gPC0gJ05vdCBUZXN0ZWQnCgojdG9wIHNpdGVzID0gMjIyLCAxNTksIDMwNiwgMzMyNSwgMTUxLCB3aXRoaW4gMTAwIG1pCnVuaXF1ZShtZXJjTEExMDBtaUJBJElOVFNJVEUpCnN0cihtZXJjTEEyNW1pQkEpCnVuaXF1ZShtZXJjTEExMDBtaUJBJHNwTmFtZSkKdW5pcXVlKGxhbmRPdGltQiRJTlRTSVRFKQoKTzIyMmJhMTAwIDwtIHN1YnNldChtZXJjTEExMDBtaUJBLG1lcmNMQTEwMG1pQkEkSU5UU0lURSA9PSAnMjIyYmEnKQpPMzMyNWJhMTAwIDwtIHN1YnNldChtZXJjTEExMDBtaUJBLG1lcmNMQTEwMG1pQkEkSU5UU0lURSA9PSAnMzMyNWJhJykKTzMwNmJhMTAwIDwtIHN1YnNldChtZXJjTEExMDBtaUJBLG1lcmNMQTEwMG1pQkEkSU5UU0lURSA9PSAnMzA2YmEnKQpPMTU5YmExMDAgPC0gc3Vic2V0KG1lcmNMQTEwMG1pQkEsbWVyY0xBMTAwbWlCQSRJTlRTSVRFID09ICcxNTliYScpCk8xNTFiYTEwMCA8LSBzdWJzZXQobWVyY0xBMTAwbWlCQSxtZXJjTEExMDBtaUJBJElOVFNJVEUgPT0gJzE1MWJhJykKCmluZExBMTAwYjIyMiA8LSB3aGljaCgobGFuZE90aW1CJGNvbW1vbiAlaW4lIE8yMjJiYTEwMCRzcE5hbWUpICYgKGxhbmRPdGltQiRJTlRTSVRFID09ICcyMjInKSkKc3RyKGluZExBMTAwYjIyMikKbGFuZE90aW1CW2luZExBMTAwYjIyMixdCgpsYW5kT3RpbUIkdGVzdFN0YXR1czEwMG1pIDwtIHJlcCgnTkEnLCBucm93KGxhbmRPdGltQikpCmxhbmRPdGltQiR0ZXN0U3RhdHVzMTAwbWlbaW5kTEExMDBiMjIyXSA8LSAnVGVzdGVkJwoKc3Vic2V0KGxhbmRPdGltQiwgbGFuZE90aW1CJElOVFNJVEUgPT0gJzMzMjUnKQppbmRMQTEwMGIzMzI1IDwtIHdoaWNoKChsYW5kT3RpbUIkY29tbW9uICVpbiUgTzMzMjViYTEwMCRzcE5hbWUpICYgKGxhbmRPdGltQiRJTlRTSVRFID09ICczMzI1JykpCnN0cihpbmRMQTEwMGIzMzI1KQpsYW5kT3RpbUJbaW5kTEExMDBiMzMyNSxdCmxhbmRPdGltQiR0ZXN0U3RhdHVzMTAwbWlbaW5kTEExMDBiMzMyNV0gPC0gJ1Rlc3RlZCcKCmluZExBMTAwYjMwNiA8LSB3aGljaCgobGFuZE90aW1CJGNvbW1vbiAlaW4lIE8zMDZiYTEwMCRzcE5hbWUpICYgKGxhbmRPdGltQiRJTlRTSVRFID09ICczMDYnKSkKc3RyKGluZExBMTAwYjMwNikKbGFuZE90aW1CW2luZExBMTAwYjMwNixdCmxhbmRPdGltQiR0ZXN0U3RhdHVzMTAwbWlbaW5kTEExMDBiMzA2XSA8LSAnVGVzdGVkJwoKaW5kTEExMDBiMTU5IDwtIHdoaWNoKChsYW5kT3RpbUIkY29tbW9uICVpbiUgTzE1OWJhMTAwJHNwTmFtZSkgJiAobGFuZE90aW1CJElOVFNJVEUgPT0gJzE1OScpKQpzdHIoaW5kTEExMDBiMTU5KQpsYW5kT3RpbUJbaW5kTEExMDBiMTU5LF0KbGFuZE90aW1CJHRlc3RTdGF0dXMxMDBtaVtpbmRMQTEwMGIxNTldIDwtICdUZXN0ZWQnCgppbmRMQTEwMGIxNTEgPC0gd2hpY2goKGxhbmRPdGltQiRjb21tb24gJWluJSBPMTUxYmExMDAkc3BOYW1lKSAmIChsYW5kT3RpbUIkSU5UU0lURSA9PSAnMTUxJykpCnN0cihpbmRMQTEwMGIxNTEpCmxhbmRPdGltQltpbmRMQTEwMGIxNTEsXQpsYW5kT3RpbUIkdGVzdFN0YXR1czEwMG1pW2luZExBMTAwYjE1MV0gPC0gJ1Rlc3RlZCcKCmxhbmRPdGltQiR0ZXN0U3RhdHVzMTAwbWlbbGFuZE90aW1CJHRlc3RTdGF0dXMxMDBtaSAlaW4lICdOQSddIDwtICdOb3QgVGVzdGVkJwoKdW5pcXVlKGxhbmRPdGltQiR0ZXN0U3RhdHVzMTAwbWkpCgpMQWJhUHJvcDI1bWkgPC0gbGFuZE90aW1CICU+JQogIGdyb3VwX2J5KElOVFNJVEUsIHRlc3RTdGF0dXMyNW1pKSAlPiUKICBzdW1tYXJpc2Uobl9kaXN0aW5jdChjb21tb24pLCBsYW5kaW5ncyA9IHN1bShsYW5kaW5nKSwgYmlvbWFzcyA9IHN1bSh3Z3RfYWIxKSkKCkxBYmFQcm9wMTAwbWkgPC0gbGFuZE90aW1CICU+JQogIGdyb3VwX2J5KElOVFNJVEUsIHRlc3RTdGF0dXMxMDBtaSkgJT4lCiAgc3VtbWFyaXNlKG5fZGlzdGluY3QoY29tbW9uKSwgbGFuZGluZ3MgPSBzdW0obGFuZGluZyksIGJpb21hc3MgPSBzdW0od2d0X2FiMSkpCgp3cml0ZS5jc3YoTEFiYVByb3AyNW1pLCAifi9GVUl0ZWFtL1B5ZGlvRGF0YS9lbnYvZGF0YV9vdXRwdXRzL0xBYmFQcm9wMjVtaS5jc3YiKQp3cml0ZS5jc3YoTEFiYVByb3AxMDBtaSwgIn4vRlVJdGVhbS9QeWRpb0RhdGEvZW52L2RhdGFfb3V0cHV0cy9MQWJhUHJvcDEwMG1pLmNzdiIpCmBgYAoKTm93IG9udG8gRmxvcmlkYQoKYGBge3J9CnN0cihsYW5kVHRpbUEpCnN0cihtZXJjRkwyNW1pQSkKc3RyKG1lcmNGTDEwMG1pQSkKdW5pcXVlKG1lcmNGTDI1bWlBJFNwZWNpZXMpCnVuaXF1ZShtZXJjRkwxMDBtaUEkU3BlY2llcykKCiNuZWVkIHRvIGNvbnZlcnQgbG93ZXIgY2FzZSB0byB1cHBlciBjYXNlIGZvciB0aGUgdHdvIGRhdGFmcmFtZXMgdG8gYmUgYWJsZSBzZWFyY2ggcHJvcGVybHkKbWVyY0ZMMjVtaUEkU3BlY2llcyA8LSB0b3VwcGVyKG1lcmNGTDI1bWlBJFNwZWNpZXMpCm1lcmNGTDI1bWlBJFNwZWNpZXMgPC0gdHJpbXdzKG1lcmNGTDI1bWlBJFNwZWNpZXMsIHdoaWNoID0gYygicmlnaHQiKSwgd2hpdGVzcGFjZSA9ICJbIFx0XHJcbl0iKQoKbWVyY0ZMMTAwbWlBJFNwZWNpZXMgPC0gdG91cHBlcihtZXJjRkwxMDBtaUEkU3BlY2llcykKbWVyY0ZMMTAwbWlBJFNwZWNpZXMgPC0gdHJpbXdzKG1lcmNGTDEwMG1pQSRTcGVjaWVzLCB3aGljaCA9IGMoInJpZ2h0IiksIHdoaXRlc3BhY2UgPSAiWyBcdFxyXG5dIikKCiNlZGl0IENPTU1PTiBTTk9PSyBpbiBNUklQIGRhdGEgdG8gcmVhZCBTTk9PSyBzbyB0aGV5IG1hdGNoCmxhbmRUdGltQSRjb21tb24gPC0gZ3N1YigiQ09NTU9OIFNOT09LIiwgIlNOT09LIiwgbGFuZFR0aW1BJGNvbW1vbikKCiN0b3Agc2l0ZXMgPSA3NzAsIDc2OSwgNjMyLCA2MTUsIDc0Miwgd2l0aGluIDI1IG1pCnVuaXF1ZShtZXJjRkwyNW1pQSRJTlRTSVRFKQp1bmlxdWUobGFuZFR0aW1BJElOVFNJVEUpClQ2MTVhMjUgPC0gc3Vic2V0KG1lcmNGTDI1bWlBLG1lcmNGTDI1bWlBJElOVFNJVEUgPT0gJzYxNScpClQ2MzJhMjUgPC0gc3Vic2V0KG1lcmNGTDI1bWlBLG1lcmNGTDI1bWlBJElOVFNJVEUgPT0gJzYzMicpClQ3NDJhMjUgPC0gc3Vic2V0KG1lcmNGTDI1bWlBLG1lcmNGTDI1bWlBJElOVFNJVEUgPT0gJzc0MicpClQ3NjlhMjUgPC0gc3Vic2V0KG1lcmNGTDI1bWlBLG1lcmNGTDI1bWlBJElOVFNJVEUgPT0gJzc2OScpClQ3NzBhMjUgPC0gc3Vic2V0KG1lcmNGTDI1bWlBLG1lcmNGTDI1bWlBJElOVFNJVEUgPT0gJzc3MCcpCgppbmRGTDI1YTYxNSA8LSB3aGljaCgobGFuZFR0aW1BJGNvbW1vbiAlaW4lIFQ2MTVhMjUkU3BlY2llcykgJiAobGFuZFR0aW1BJElOVFNJVEUgPT0gJzYxNScpKQpzdHIoaW5kRkwyNWE2MTUpCmxhbmRUdGltQVtpbmRGTDI1YTYxNSxdCnVuaXF1ZSgoc3Vic2V0KGxhbmRUdGltQSxsYW5kVHRpbUEkSU5UU0lURSA9PSAnNjE1JykpJGNvbW1vbikKdW5pcXVlKFQ2MTVhMjUkU3BlY2llcykKCmxhbmRUdGltQSR0ZXN0U3RhdHVzMjVtaSA8LSByZXAoJ05BJywgbnJvdyhsYW5kVHRpbUEpKQpsYW5kVHRpbUEkdGVzdFN0YXR1czI1bWlbaW5kRkwyNWE2MTVdIDwtICdUZXN0ZWQnCgppbmRGTDI1YTYzMiA8LSB3aGljaCgobGFuZFR0aW1BJGNvbW1vbiAlaW4lIFQ2MzJhMjUkU3BlY2llcykgJiAobGFuZFR0aW1BJElOVFNJVEUgPT0gJzYzMicpKQpzdHIoaW5kRkwyNWE2MzIpCmxhbmRUdGltQVtpbmRGTDI1YTYzMixdCnVuaXF1ZShUNjMyYTI1JFNwZWNpZXMpCmxhbmRUdGltQSR0ZXN0U3RhdHVzMjVtaVtpbmRGTDI1YTYzMl0gPC0gJ1Rlc3RlZCcKCmluZEZMMjVhNzQyIDwtIHdoaWNoKChsYW5kVHRpbUEkY29tbW9uICVpbiUgVDc0MmEyNSRTcGVjaWVzKSAmIChsYW5kVHRpbUEkSU5UU0lURSA9PSAnNzQyJykpCnN0cihpbmRGTDI1YTc0MikKbGFuZFR0aW1BW2luZEZMMjVhNzQyLF0KbGFuZFR0aW1BJHRlc3RTdGF0dXMyNW1pW2luZEZMMjVhNzQyXSA8LSAnVGVzdGVkJwoKaW5kRkwyNWE3NjkgPC0gd2hpY2goKGxhbmRUdGltQSRjb21tb24gJWluJSBUNzY5YTI1JFNwZWNpZXMpICYgKGxhbmRUdGltQSRJTlRTSVRFID09ICc3NjknKSkKc3RyKGluZEZMMjVhNzY5KQpsYW5kVHRpbUFbaW5kRkwyNWE3NjksXQpsYW5kVHRpbUEkdGVzdFN0YXR1czI1bWlbaW5kRkwyNWE3NjldIDwtICdUZXN0ZWQnCgppbmRGTDI1YTc3MCA8LSB3aGljaCgobGFuZFR0aW1BJGNvbW1vbiAlaW4lIFQ3NzBhMjUkU3BlY2llcykgJiAobGFuZFR0aW1BJElOVFNJVEUgPT0gJzc3MCcpKQpzdHIoaW5kRkwyNWE3NzApCmxhbmRUdGltQVtpbmRGTDI1YTc3MCxdCmxhbmRUdGltQSR0ZXN0U3RhdHVzMjVtaVtpbmRGTDI1YTc3MF0gPC0gJ1Rlc3RlZCcKCmxhbmRUdGltQSR0ZXN0U3RhdHVzMjVtaVtsYW5kVHRpbUEkdGVzdFN0YXR1czI1bWkgJWluJSAnTkEnXSA8LSAnTm90IFRlc3RlZCcKYGBgCgoxMDAgbWkgY2h1bmsgZm9yIEZMLCB0aW1lIGZyYW1lIEEKCmBgYHtyfQojdG9wIHNpdGVzID0gNzcwLCA3NjksIDYzMiwgNjE1LCA3NDIsIHdpdGhpbiAxMDAgbWkKdW5pcXVlKG1lcmNGTDEwMG1pQSRJTlRTSVRFKQp1bmlxdWUobGFuZFR0aW1BJElOVFNJVEUpClQ2MTVhMTAwIDwtIHN1YnNldChtZXJjRkwxMDBtaUEsbWVyY0ZMMTAwbWlBJElOVFNJVEUgPT0gJzYxNScpClQ2MzJhMTAwIDwtIHN1YnNldChtZXJjRkwxMDBtaUEsbWVyY0ZMMTAwbWlBJElOVFNJVEUgPT0gJzYzMicpClQ3NDJhMTAwIDwtIHN1YnNldChtZXJjRkwxMDBtaUEsbWVyY0ZMMTAwbWlBJElOVFNJVEUgPT0gJzc0MicpClQ3NjlhMTAwIDwtIHN1YnNldChtZXJjRkwxMDBtaUEsbWVyY0ZMMTAwbWlBJElOVFNJVEUgPT0gJzc2OScpClQ3NzBhMTAwIDwtIHN1YnNldChtZXJjRkwxMDBtaUEsbWVyY0ZMMTAwbWlBJElOVFNJVEUgPT0gJzc3MCcpCgppbmRGTDEwMGE2MTUgPC0gd2hpY2goKGxhbmRUdGltQSRjb21tb24gJWluJSBUNjE1YTEwMCRTcGVjaWVzKSAmIChsYW5kVHRpbUEkSU5UU0lURSA9PSAnNjE1JykpCnN0cihpbmRGTDEwMGE2MTUpCmxhbmRUdGltQVtpbmRGTDEwMGE2MTUsXQp1bmlxdWUoKHN1YnNldChsYW5kVHRpbUEsbGFuZFR0aW1BJElOVFNJVEUgPT0gJzYxNScpKSRjb21tb24pCnVuaXF1ZShUNjE1YTEwMCRTcGVjaWVzKQoKbGFuZFR0aW1BJHRlc3RTdGF0dXMxMDBtaSA8LSByZXAoJ05BJywgbnJvdyhsYW5kVHRpbUEpKQpsYW5kVHRpbUEkdGVzdFN0YXR1czEwMG1pW2luZEZMMTAwYTYxNV0gPC0gJ1Rlc3RlZCcKCmluZEZMMTAwYTYzMiA8LSB3aGljaCgobGFuZFR0aW1BJGNvbW1vbiAlaW4lIFQ2MzJhMTAwJFNwZWNpZXMpICYgKGxhbmRUdGltQSRJTlRTSVRFID09ICc2MzInKSkKc3RyKGluZEZMMTAwYTYzMikKbGFuZFR0aW1BW2luZEZMMTAwYTYzMixdCnVuaXF1ZShUNjMyYTEwMCRTcGVjaWVzKQpsYW5kVHRpbUEkdGVzdFN0YXR1czEwMG1pW2luZEZMMTAwYTYzMl0gPC0gJ1Rlc3RlZCcKCmluZEZMMTAwYTc0MiA8LSB3aGljaCgobGFuZFR0aW1BJGNvbW1vbiAlaW4lIFQ3NDJhMTAwJFNwZWNpZXMpICYgKGxhbmRUdGltQSRJTlRTSVRFID09ICc3NDInKSkKc3RyKGluZEZMMTAwYTc0MikKbGFuZFR0aW1BW2luZEZMMTAwYTc0MixdCmxhbmRUdGltQSR0ZXN0U3RhdHVzMTAwbWlbaW5kRkwxMDBhNzQyXSA8LSAnVGVzdGVkJwoKaW5kRkwxMDBhNzY5IDwtIHdoaWNoKChsYW5kVHRpbUEkY29tbW9uICVpbiUgVDc2OWExMDAkU3BlY2llcykgJiAobGFuZFR0aW1BJElOVFNJVEUgPT0gJzc2OScpKQpzdHIoaW5kRkwxMDBhNzY5KQpsYW5kVHRpbUFbaW5kRkwxMDBhNzY5LF0KbGFuZFR0aW1BJHRlc3RTdGF0dXMxMDBtaVtpbmRGTDEwMGE3NjldIDwtICdUZXN0ZWQnCgppbmRGTDEwMGE3NzAgPC0gd2hpY2goKGxhbmRUdGltQSRjb21tb24gJWluJSBUNzcwYTEwMCRTcGVjaWVzKSAmIChsYW5kVHRpbUEkSU5UU0lURSA9PSAnNzcwJykpCnN0cihpbmRGTDEwMGE3NzApCmxhbmRUdGltQVtpbmRGTDEwMGE3NzAsXQpsYW5kVHRpbUEkdGVzdFN0YXR1czEwMG1pW2luZEZMMTAwYTc3MF0gPC0gJ1Rlc3RlZCcKCmxhbmRUdGltQSR0ZXN0U3RhdHVzMTAwbWlbbGFuZFR0aW1BJHRlc3RTdGF0dXMxMDBtaSAlaW4lICdOQSddIDwtICdOb3QgVGVzdGVkJwoKRkxhUHJvcDI1bWkgPC0gbGFuZFR0aW1BICU+JQogIGdyb3VwX2J5KElOVFNJVEUsIHRlc3RTdGF0dXMyNW1pKSAlPiUKICBzdW1tYXJpc2Uobl9kaXN0aW5jdChjb21tb24pLCBsYW5kaW5ncyA9IHN1bShsYW5kaW5nKSwgYmlvbWFzcyA9IHN1bSh3Z3RfYWIxKSkKCkZMYVByb3AxMDBtaSA8LSBsYW5kVHRpbUEgJT4lCiAgZ3JvdXBfYnkoSU5UU0lURSwgdGVzdFN0YXR1czEwMG1pKSAlPiUKICBzdW1tYXJpc2Uobl9kaXN0aW5jdChjb21tb24pLCBsYW5kaW5ncyA9IHN1bShsYW5kaW5nKSwgYmlvbWFzcyA9IHN1bSh3Z3RfYWIxKSkKCndyaXRlLmNzdihGTGFQcm9wMjVtaSwgIn4vRlVJdGVhbS9QeWRpb0RhdGEvZW52L2RhdGFfb3V0cHV0cy9GTGFQcm9wMjVtaS5jc3YiKQp3cml0ZS5jc3YoRkxhUHJvcDEwMG1pLCAifi9GVUl0ZWFtL1B5ZGlvRGF0YS9lbnYvZGF0YV9vdXRwdXRzL0ZMYVByb3AxMDBtaS5jc3YiKQpgYGAKClRpbWVmcmFtZSBCLCAyNSBtaQoKYGBge3J9CnN0cihsYW5kVHRpbUIpCnN0cihtZXJjRkwyNW1pQikKdW5pcXVlKG1lcmNGTDI1bWlCJFNwZWNpZXMpCgojbmVlZCB0byBjb252ZXJ0IGxvd2VyIGNhc2UgdG8gdXBwZXIgY2FzZSBmb3IgdGhlIHR3byBkYXRhZnJhbWVzIHRvIGJlIGFibGUgc2VhcmNoIHByb3Blcmx5Cm1lcmNGTDI1bWlCJFNwZWNpZXMgPC0gdG91cHBlcihtZXJjRkwyNW1pQiRTcGVjaWVzKQptZXJjRkwyNW1pQiRTcGVjaWVzIDwtIHRyaW13cyhtZXJjRkwyNW1pQiRTcGVjaWVzLCB3aGljaCA9IGMoInJpZ2h0IiksIHdoaXRlc3BhY2UgPSAiWyBcdFxyXG5dIikKCm1lcmNGTDEwMG1pQiRTcGVjaWVzIDwtIHRvdXBwZXIobWVyY0ZMMTAwbWlCJFNwZWNpZXMpCm1lcmNGTDEwMG1pQiRTcGVjaWVzIDwtIHRyaW13cyhtZXJjRkwxMDBtaUIkU3BlY2llcywgd2hpY2ggPSBjKCJyaWdodCIpLCB3aGl0ZXNwYWNlID0gIlsgXHRcclxuXSIpCgojZWRpdCBDT01NT04gU05PT0sgaW4gTVJJUCBkYXRhIHRvIHJlYWQgU05PT0sgc28gdGhleSBtYXRjaApsYW5kVHRpbUIkY29tbW9uIDwtIGdzdWIoIkNPTU1PTiBTTk9PSyIsICJTTk9PSyIsIGxhbmRUdGltQiRjb21tb24pCgojdG9wIHNpdGVzID0gNzcwLCA2MzIsIDM4MDIsIDc2OSwgNjE0LCB3aXRoaW4gMjUgbWkKdW5pcXVlKG1lcmNGTDI1bWlCJElOVFNJVEUpCnVuaXF1ZShsYW5kVHRpbUIkSU5UU0lURSkKVDYxNGIyNSA8LSBzdWJzZXQobWVyY0ZMMjVtaUIsbWVyY0ZMMjVtaUIkSU5UU0lURSA9PSAnNjE0YicpClQ2MzJiMjUgPC0gc3Vic2V0KG1lcmNGTDI1bWlCLG1lcmNGTDI1bWlCJElOVFNJVEUgPT0gJzYzMmInKQpUMzgwMmIyNSA8LSBzdWJzZXQobWVyY0ZMMjVtaUIsbWVyY0ZMMjVtaUIkSU5UU0lURSA9PSAnMzgwMmInKQpUNzY5YjI1IDwtIHN1YnNldChtZXJjRkwyNW1pQixtZXJjRkwyNW1pQiRJTlRTSVRFID09ICc3NjliJykKVDc3MGIyNSA8LSBzdWJzZXQobWVyY0ZMMjVtaUIsbWVyY0ZMMjVtaUIkSU5UU0lURSA9PSAnNzcwYicpCgppbmRGTDI1YTYxNCA8LSB3aGljaCgobGFuZFR0aW1CJGNvbW1vbiAlaW4lIFQ2MTRiMjUkU3BlY2llcykgJiAobGFuZFR0aW1CJElOVFNJVEUgPT0gJzYxNCcpKQpzdHIoaW5kRkwyNWE2MTQpCmxhbmRUdGltQltpbmRGTDI1YTYxNCxdCnVuaXF1ZSgoc3Vic2V0KGxhbmRUdGltQixsYW5kVHRpbUIkSU5UU0lURSA9PSAnNjE0JykpJGNvbW1vbikKdW5pcXVlKFQ2MTRiMjUkU3BlY2llcykKCmxhbmRUdGltQiR0ZXN0U3RhdHVzMjVtaSA8LSByZXAoJ05BJywgbnJvdyhsYW5kVHRpbUIpKQpsYW5kVHRpbUIkdGVzdFN0YXR1czI1bWlbaW5kRkwyNWE2MTRdIDwtICdUZXN0ZWQnCgppbmRGTDI1YTYzMiA8LSB3aGljaCgobGFuZFR0aW1CJGNvbW1vbiAlaW4lIFQ2MzJiMjUkU3BlY2llcykgJiAobGFuZFR0aW1CJElOVFNJVEUgPT0gJzYzMicpKQpzdHIoaW5kRkwyNWE2MzIpCmxhbmRUdGltQltpbmRGTDI1YTYzMixdCnVuaXF1ZShUNjMyYjI1JFNwZWNpZXMpCmxhbmRUdGltQiR0ZXN0U3RhdHVzMjVtaVtpbmRGTDI1YTYzMl0gPC0gJ1Rlc3RlZCcKCmluZEZMMjVhMzgwMiA8LSB3aGljaCgobGFuZFR0aW1CJGNvbW1vbiAlaW4lIFQzODAyYjI1JFNwZWNpZXMpICYgKGxhbmRUdGltQiRJTlRTSVRFID09ICczODAyJykpCnN0cihpbmRGTDI1YTM4MDIpCmxhbmRUdGltQltpbmRGTDI1YTM4MDIsXQpsYW5kVHRpbUIkdGVzdFN0YXR1czI1bWlbaW5kRkwyNWEzODAyXSA8LSAnVGVzdGVkJwoKaW5kRkwyNWE3NjkgPC0gd2hpY2goKGxhbmRUdGltQiRjb21tb24gJWluJSBUNzY5YjI1JFNwZWNpZXMpICYgKGxhbmRUdGltQiRJTlRTSVRFID09ICc3NjknKSkKc3RyKGluZEZMMjVhNzY5KQpsYW5kVHRpbUJbaW5kRkwyNWE3NjksXQpsYW5kVHRpbUIkdGVzdFN0YXR1czI1bWlbaW5kRkwyNWE3NjldIDwtICdUZXN0ZWQnCgppbmRGTDI1YTc3MCA8LSB3aGljaCgobGFuZFR0aW1CJGNvbW1vbiAlaW4lIFQ3NzBiMjUkU3BlY2llcykgJiAobGFuZFR0aW1CJElOVFNJVEUgPT0gJzc3MCcpKQpzdHIoaW5kRkwyNWE3NzApCmxhbmRUdGltQltpbmRGTDI1YTc3MCxdCmxhbmRUdGltQiR0ZXN0U3RhdHVzMjVtaVtpbmRGTDI1YTc3MF0gPC0gJ1Rlc3RlZCcKCmxhbmRUdGltQiR0ZXN0U3RhdHVzMjVtaVtsYW5kVHRpbUIkdGVzdFN0YXR1czI1bWkgJWluJSAnTkEnXSA8LSAnTm90IFRlc3RlZCcKYGBgCgpub3cgMTAwIG1pLCB0aW1lZnJhbWUgQgoKYGBge3J9CiN0b3Agc2l0ZXMgPSA3NzAsIDYzMiwgMzgwMiwgNzY5LCA2MTQsIHdpdGhpbiAxMDAgbWkKdW5pcXVlKG1lcmNGTDEwMG1pQiRJTlRTSVRFKQp1bmlxdWUobGFuZFR0aW1CJElOVFNJVEUpClQ2MTRiMTAwIDwtIHN1YnNldChtZXJjRkwxMDBtaUIsbWVyY0ZMMTAwbWlCJElOVFNJVEUgPT0gJzYxNGInKQpUNjMyYjEwMCA8LSBzdWJzZXQobWVyY0ZMMTAwbWlCLG1lcmNGTDEwMG1pQiRJTlRTSVRFID09ICc2MzJiJykKVDM4MDJiMTAwIDwtIHN1YnNldChtZXJjRkwxMDBtaUIsbWVyY0ZMMTAwbWlCJElOVFNJVEUgPT0gJzM4MDJiJykKVDc2OWIxMDAgPC0gc3Vic2V0KG1lcmNGTDEwMG1pQixtZXJjRkwxMDBtaUIkSU5UU0lURSA9PSAnNzY5YicpClQ3NzBiMTAwIDwtIHN1YnNldChtZXJjRkwxMDBtaUIsbWVyY0ZMMTAwbWlCJElOVFNJVEUgPT0gJzc3MGInKQoKaW5kRkwxMDBhNjE0IDwtIHdoaWNoKChsYW5kVHRpbUIkY29tbW9uICVpbiUgVDYxNGIxMDAkU3BlY2llcykgJiAobGFuZFR0aW1CJElOVFNJVEUgPT0gJzYxNCcpKQpzdHIoaW5kRkwxMDBhNjE0KQpsYW5kVHRpbUJbaW5kRkwxMDBhNjE0LF0KdW5pcXVlKChzdWJzZXQobGFuZFR0aW1CLGxhbmRUdGltQiRJTlRTSVRFID09ICc2MTQnKSkkY29tbW9uKQp1bmlxdWUoVDYxNGIxMDAkU3BlY2llcykKCmxhbmRUdGltQiR0ZXN0U3RhdHVzMTAwbWkgPC0gcmVwKCdOQScsIG5yb3cobGFuZFR0aW1CKSkKbGFuZFR0aW1CJHRlc3RTdGF0dXMxMDBtaVtpbmRGTDEwMGE2MTRdIDwtICdUZXN0ZWQnCgppbmRGTDEwMGE2MzIgPC0gd2hpY2goKGxhbmRUdGltQiRjb21tb24gJWluJSBUNjMyYjEwMCRTcGVjaWVzKSAmIChsYW5kVHRpbUIkSU5UU0lURSA9PSAnNjMyJykpCnN0cihpbmRGTDEwMGE2MzIpCmxhbmRUdGltQltpbmRGTDEwMGE2MzIsXQp1bmlxdWUoVDYzMmIxMDAkU3BlY2llcykKbGFuZFR0aW1CJHRlc3RTdGF0dXMxMDBtaVtpbmRGTDEwMGE2MzJdIDwtICdUZXN0ZWQnCgppbmRGTDEwMGEzODAyIDwtIHdoaWNoKChsYW5kVHRpbUIkY29tbW9uICVpbiUgVDM4MDJiMTAwJFNwZWNpZXMpICYgKGxhbmRUdGltQiRJTlRTSVRFID09ICczODAyJykpCnN0cihpbmRGTDEwMGEzODAyKQpsYW5kVHRpbUJbaW5kRkwxMDBhMzgwMixdCmxhbmRUdGltQiR0ZXN0U3RhdHVzMTAwbWlbaW5kRkwxMDBhMzgwMl0gPC0gJ1Rlc3RlZCcKCmluZEZMMTAwYTc2OSA8LSB3aGljaCgobGFuZFR0aW1CJGNvbW1vbiAlaW4lIFQ3NjliMTAwJFNwZWNpZXMpICYgKGxhbmRUdGltQiRJTlRTSVRFID09ICc3NjknKSkKc3RyKGluZEZMMTAwYTc2OSkKbGFuZFR0aW1CW2luZEZMMTAwYTc2OSxdCnVuaXF1ZSgoc3Vic2V0KGxhbmRUdGltQixsYW5kVHRpbUIkSU5UU0lURSA9PSAnNzY5JykpJGNvbW1vbikKdW5pcXVlKFQ3NjliMTAwJFNwZWNpZXMpCmxhbmRUdGltQiR0ZXN0U3RhdHVzMTAwbWlbaW5kRkwxMDBhNzY5XSA8LSAnVGVzdGVkJwoKaW5kRkwxMDBhNzcwIDwtIHdoaWNoKChsYW5kVHRpbUIkY29tbW9uICVpbiUgVDc3MGIxMDAkU3BlY2llcykgJiAobGFuZFR0aW1CJElOVFNJVEUgPT0gJzc3MCcpKQpzdHIoaW5kRkwxMDBhNzcwKQpsYW5kVHRpbUJbaW5kRkwxMDBhNzcwLF0KbGFuZFR0aW1CJHRlc3RTdGF0dXMxMDBtaVtpbmRGTDEwMGE3NzBdIDwtICdUZXN0ZWQnCgpsYW5kVHRpbUIkdGVzdFN0YXR1czEwMG1pW2xhbmRUdGltQiR0ZXN0U3RhdHVzMTAwbWkgJWluJSAnTkEnXSA8LSAnTm90IFRlc3RlZCcKCkZMYlByb3AyNW1pIDwtIGxhbmRUdGltQiAlPiUKICBncm91cF9ieShJTlRTSVRFLCB0ZXN0U3RhdHVzMjVtaSkgJT4lCiAgc3VtbWFyaXNlKG5fZGlzdGluY3QoY29tbW9uKSwgbGFuZGluZ3MgPSBzdW0obGFuZGluZyksIGJpb21hc3MgPSBzdW0od2d0X2FiMSkpCgpGTGJQcm9wMTAwbWkgPC0gbGFuZFR0aW1CICU+JQogIGdyb3VwX2J5KElOVFNJVEUsIHRlc3RTdGF0dXMxMDBtaSkgJT4lCiAgc3VtbWFyaXNlKG5fZGlzdGluY3QoY29tbW9uKSwgbGFuZGluZ3MgPSBzdW0obGFuZGluZyksIGJpb21hc3MgPSBzdW0od2d0X2FiMSkpCgp3cml0ZS5jc3YoRkxiUHJvcDI1bWksICJ+L0ZVSXRlYW0vUHlkaW9EYXRhL2Vudi9kYXRhX291dHB1dHMvRkxiUHJvcDI1bWkuY3N2IikKd3JpdGUuY3N2KEZMYlByb3AxMDBtaSwgIn4vRlVJdGVhbS9QeWRpb0RhdGEvZW52L2RhdGFfb3V0cHV0cy9GTGJQcm9wMTAwbWkuY3N2IikKYGBgCgoKU2l6ZSBDb21wYXJpc29uCnRyeSBpdCBvdXQsIExBIHRpbWUgZnJhbWUgQQoKYGBge3IsIGVjaG8gPSBGQUxTRX0KCiMjR08gVE8gTkVYVCBTRUNUSU9OIF8gSUdOT1JFIFRISVMgT05FCnN0cihERmxhMTAwbWlBKQpzdHIobWVyY0xBMTAwbWlBKQpzdHIobGFuZE90aW1BKQoKCgojMjIyLCAyMzEsIDMwNiwgMTU1LCAxNTEsCiN3Z3QsIHZlY3RvcnMgMjIyCkF3Z3QyMjJtcmlwIDwtIHN1YnNldChsYW5kT3RpbUEsbGFuZE90aW1BJElOVFNJVEUgPT0gJzIyMicpCkF3Z3QyMjJtcmlwVCA8LSBzdWJzZXQoQXdndDIyMm1yaXAsQXdndDIyMm1yaXAkdGVzdFN0YXR1czEwMG1pID09ICdUZXN0ZWQnKQpBd2d0MjIybWVyYyA8LSBzdWJzZXQoREZsYTEwMG1pQSxERmxhMTAwbWlBJElOVFNJVEUgPT0gJzIyMicpCkF3Z3QyMjJtZXJjVCA8LSBBd2d0MjIybWVyY1tBd2d0MjIybWVyYyRzcE5hbWUgJWluJSAodW5pcXVlKEF3Z3QyMjJtcmlwVCRjb21tb24pKSxdCgp1bmlxdWUoQXdndDIyMm1yaXAkY29tbW9uKQp1bmlxdWUoQXdndDIyMm1yaXBUJGNvbW1vbikKClZpZXcoQXdndDIyMm1yaXBUKQpWaWV3KEF3Z3QyMjJtZXJjKQpBc3ViMjIybXJpcCA8LSBBd2d0MjIybXJpcFRbLGMoMTE6MTIsMjEpXQpBc3ViMjIybXJpcCRhdmVXdF9nIDwtIChBd2d0MjIybXJpcFQkd2d0X2FiMS9Bd2d0MjIybXJpcFQkbGFuZGluZykqMTAwMCAjdG8gZ2V0IGF2ZSBzaXplIHBlciBmaXNoCkFzdWIyMjJtcmlwJHNvdXJjZSA8LSAnTVJJUCcKCmNvbG5hbWVzKEFzdWIyMjJtcmlwKSA8LSBjKCJaSVAiLCAic3BOYW1lIiwgImF2ZVd0X2ciLCJzb3VyY2UiKQoKQXN1YjIyMm1lcmMgPC0gQXdndDIyMm1lcmNUWyxjKDEwOjExKV0KQXN1YjIyMm1lcmMkc291cmNlIDwtICdNRVJDJwpBc3ViMjIybWVyYyRaSVAgPC0gJ05BJwpBc3ViMjIybWVyYyA8LSBBc3ViMjIybWVyY1ssYygiWklQIiwgInNwTmFtZSIsICJhdmVXdF9nIiwic291cmNlIildCnVuaXF1ZShBc3ViMjIybWVyYyRzcE5hbWUpCgpjb21wMjIyYSA8LSByYmluZChBc3ViMjIybXJpcCxBc3ViMjIybWVyYykKCmdncGxvdChjb21wMjIyYSwgYWVzKHg9c3BOYW1lLCB5PWF2ZVd0X2csIGZpbGwgPSBzb3VyY2UpKSAgKyAKICBnZW9tX2JveHBsb3QoKSArIAogIHhsYWIoIlNwZWNpZXMiKSArIAogIHlsYWIoIkF2ZXJhZ2UgV2VpZ2h0IChnKSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIsIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSwgIAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsIGZhY2UgPSAicGxhaW4iKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBmYWNlID0gInBsYWluIikpICsgCiAgdGhlbWUobGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJwbGFpbiIpLAogICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSkKCmxpYnJhcnkocGx5cikKcmVzdWx0cy4yMjJhIDwtZGRwbHkoY29tcDIyMmEsLihzcE5hbWUpLGZ1bmN0aW9uKHgpIHN1bW1hcml6ZSh4LApQdmFsdWU9dC50ZXN0KGF2ZVd0X2d+c291cmNlLGRhdGE9eCxuYS5ybT1UUlVFLHBhaXJlZD1GKSRwLnZhbHVlLApFc3RpbWF0ZS5NRVJDPXQudGVzdChhdmVXdF9nfnNvdXJjZSxkYXRhPXgsbmEucm09VFJVRSxwYWlyZWQ9RikkZXN0aW1hdGVbMV0sCkVzdGltYXRlLk1SSVA9dC50ZXN0KGF2ZVd0X2d+c291cmNlLGRhdGE9eCxuYS5ybT1UUlVFLHBhaXJlZD1GKSRlc3RpbWF0ZVsyXSkpCnJlc3VsdHMuMjIyYSRhZGpQIDwtIHAuYWRqdXN0KHJlc3VsdHMuMjIyYSRQdmFsdWUsIG1ldGhvZCA9ICdmZHInLCBuID0gbGVuZ3RoKHJlc3VsdHMuMjIyYSRQdmFsdWUpKQpyZXN1bHRzLjIyMmEkbWVhbkRpZmYgPC0gKHJlc3VsdHMuMjIyYSRFc3RpbWF0ZS5NRVJDIC0gcmVzdWx0cy4yMjJhJEVzdGltYXRlLk1SSVApCnJlc3VsdHMuMjIyYQoKI3dndCwgdmVjdG9ycyAyMzEKQXdndDIzMW1yaXAgPC0gc3Vic2V0KGxhbmRPdGltQSxsYW5kT3RpbUEkSU5UU0lURSA9PSAnMjMxJykKQXdndDIzMW1yaXBUIDwtIHN1YnNldChBd2d0MjMxbXJpcCxBd2d0MjMxbXJpcCR0ZXN0U3RhdHVzMTAwbWkgPT0gJ1Rlc3RlZCcpCkF3Z3QyMzFtZXJjIDwtIHN1YnNldChERmxhMTAwbWlBLERGbGExMDBtaUEkSU5UU0lURSA9PSAnMjMxJykKQXdndDIzMW1lcmNUIDwtIEF3Z3QyMzFtZXJjW0F3Z3QyMzFtZXJjJHNwTmFtZSAlaW4lICh1bmlxdWUoQXdndDIzMW1yaXBUJGNvbW1vbikpLF0KCnVuaXF1ZShBd2d0MjMxbXJpcCRjb21tb24pCnVuaXF1ZShBd2d0MjMxbXJpcFQkY29tbW9uKQoKQXN1YjIzMW1yaXAgPC0gQXdndDIzMW1yaXBUWyxjKDExOjEyLDIxKV0KQXN1YjIzMW1yaXAkc291cmNlIDwtICdNUklQJwpjb2xuYW1lcyhBc3ViMjMxbXJpcCkgPC0gYygiWklQIiwgInNwTmFtZSIsICJhdmVXdF9nIiwic291cmNlIikKCkFzdWIyMzFtZXJjIDwtIEF3Z3QyMzFtZXJjVFssYygxMDoxMSldCkFzdWIyMzFtZXJjJHNvdXJjZSA8LSAnTUVSQycKQXN1YjIzMW1lcmMkWklQIDwtICdOQScKQXN1YjIzMW1lcmMgPC0gQXN1YjIzMW1lcmNbLGMoIlpJUCIsICJzcE5hbWUiLCAiYXZlV3RfZyIsInNvdXJjZSIpXQp1bmlxdWUoQXN1YjIzMW1lcmMkc3BOYW1lKQoKY29tcDIzMWEgPC0gcmJpbmQoQXN1YjIzMW1yaXAsQXN1YjIzMW1lcmMpCgpnZ3Bsb3QoY29tcDIzMWEsIGFlcyh4PXNwTmFtZSwgeT1hdmVXdF9nLCBmaWxsID0gc291cmNlKSkgICsgCiAgZ2VvbV9ib3hwbG90KCkgKyAKICB4bGFiKCJTcGVjaWVzIikgKyAKICB5bGFiKCJBdmVyYWdlIFdlaWdodCAoZykiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiLCBhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksICAKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBmYWNlID0gInBsYWluIiksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFjZSA9ICJwbGFpbiIpKSArIAogIHRoZW1lKGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAicGxhaW4iKSwKICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIikpCgpyZXN1bHRzLjIzMWEgPC1kZHBseShjb21wMjMxYSwuKHNwTmFtZSksZnVuY3Rpb24oeCkgc3VtbWFyaXplKHgsClB2YWx1ZT10LnRlc3QoYXZlV3RfZ35zb3VyY2UsZGF0YT14LG5hLnJtPVRSVUUscGFpcmVkPUYpJHAudmFsdWUsCkVzdGltYXRlLk1FUkM9dC50ZXN0KGF2ZVd0X2d+c291cmNlLGRhdGE9eCxuYS5ybT1UUlVFLHBhaXJlZD1GKSRlc3RpbWF0ZVsxXSwKRXN0aW1hdGUuTVJJUD10LnRlc3QoYXZlV3RfZ35zb3VyY2UsZGF0YT14LG5hLnJtPVRSVUUscGFpcmVkPUYpJGVzdGltYXRlWzJdKSkKcmVzdWx0cy4yMzFhJGFkalAgPC0gcC5hZGp1c3QocmVzdWx0cy4yMzFhJFB2YWx1ZSwgbWV0aG9kID0gJ2ZkcicsIG4gPSBsZW5ndGgocmVzdWx0cy4yMzFhJFB2YWx1ZSkpCnJlc3VsdHMuMjMxYSRtZWFuRGlmZiA8LSAocmVzdWx0cy4yMzFhJEVzdGltYXRlLk1FUkMgLSByZXN1bHRzLjIzMWEkRXN0aW1hdGUuTVJJUCkKcmVzdWx0cy4yMzFhCgojd2d0LCB2ZWN0b3JzIDMwNgpBd2d0MzA2bXJpcCA8LSBzdWJzZXQobGFuZE90aW1BLGxhbmRPdGltQSRJTlRTSVRFID09ICczMDYnKQpBd2d0MzA2bXJpcFQgPC0gc3Vic2V0KEF3Z3QzMDZtcmlwLEF3Z3QzMDZtcmlwJHRlc3RTdGF0dXMxMDBtaSA9PSAnVGVzdGVkJykKQXdndDMwNm1lcmMgPC0gc3Vic2V0KERGbGExMDBtaUEsREZsYTEwMG1pQSRJTlRTSVRFID09ICczMDYnKQpBd2d0MzA2bWVyY1QgPC0gQXdndDMwNm1lcmNbQXdndDMwNm1lcmMkc3BOYW1lICVpbiUgKHVuaXF1ZShBd2d0MzA2bXJpcFQkY29tbW9uKSksXQoKQXN1YjMwNm1yaXAgPC0gQXdndDMwNm1yaXBUWyxjKDExOjEyLDIxKV0KQXN1YjMwNm1yaXAkc291cmNlIDwtICdNUklQJwpjb2xuYW1lcyhBc3ViMzA2bXJpcCkgPC0gYygiWklQIiwgInNwTmFtZSIsICJhdmVXdF9nIiwic291cmNlIikKCkFzdWIzMDZtZXJjIDwtIEF3Z3QzMDZtZXJjVFssYygxMDoxMSldCkFzdWIzMDZtZXJjJHNvdXJjZSA8LSAnTUVSQycKQXN1YjMwNm1lcmMkWklQIDwtICdOQScKQXN1YjMwNm1lcmMgPC0gQXN1YjMwNm1lcmNbLGMoIlpJUCIsICJzcE5hbWUiLCAiYXZlV3RfZyIsInNvdXJjZSIpXQoKY29tcDMwNmEgPC0gcmJpbmQoQXN1YjMwNm1yaXAsQXN1YjMwNm1lcmMpCmNvdW50KEFzdWIzMDZtZXJjJHNwTmFtZSkKCmdncGxvdChjb21wMzA2YSwgYWVzKHg9c3BOYW1lLCB5PWF2ZVd0X2csIGZpbGwgPSBzb3VyY2UpKSAgKyAKICBnZW9tX2JveHBsb3QoKSArIAogIHhsYWIoIlNwZWNpZXMiKSArIAogIHlsYWIoIkF2ZXJhZ2UgV2VpZ2h0IChnKSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIsIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSwgIAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsIGZhY2UgPSAicGxhaW4iKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBmYWNlID0gInBsYWluIikpICsgCiAgdGhlbWUobGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJwbGFpbiIpLAogICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSkKCnJlc3VsdHMuMzA2YSA8LWRkcGx5KGNvbXAzMDZhLC4oc3BOYW1lKSxmdW5jdGlvbih4KSBzdW1tYXJpemUoeCwKUHZhbHVlPXQudGVzdChhdmVXdF9nfnNvdXJjZSxkYXRhPXgsbmEucm09VFJVRSxwYWlyZWQ9RikkcC52YWx1ZSwKRXN0aW1hdGUuTUVSQz10LnRlc3QoYXZlV3RfZ35zb3VyY2UsZGF0YT14LG5hLnJtPVRSVUUscGFpcmVkPUYpJGVzdGltYXRlWzFdLApFc3RpbWF0ZS5NUklQPXQudGVzdChhdmVXdF9nfnNvdXJjZSxkYXRhPXgsbmEucm09VFJVRSxwYWlyZWQ9RikkZXN0aW1hdGVbMl0pKQpyZXN1bHRzLjMwNmEkYWRqUCA8LSBwLmFkanVzdChyZXN1bHRzLjMwNmEkUHZhbHVlLCBtZXRob2QgPSAnZmRyJywgbiA9IGxlbmd0aChyZXN1bHRzLjMwNmEkUHZhbHVlKSkKcmVzdWx0cy4zMDZhJG1lYW5EaWZmIDwtIChyZXN1bHRzLjMwNmEkRXN0aW1hdGUuTUVSQyAtIHJlc3VsdHMuMzA2YSRFc3RpbWF0ZS5NUklQKQpyZXN1bHRzLjMwNmEKCiN3Z3QsIHZlY3RvcnMgMTU1CkF3Z3QxNTVtcmlwIDwtIHN1YnNldChsYW5kT3RpbUEsbGFuZE90aW1BJElOVFNJVEUgPT0gJzE1NScpCkF3Z3QxNTVtcmlwVCA8LSBzdWJzZXQoQXdndDE1NW1yaXAsQXdndDE1NW1yaXAkdGVzdFN0YXR1czEwMG1pID09ICdUZXN0ZWQnKQpBd2d0MTU1bWVyYyA8LSBzdWJzZXQoREZsYTEwMG1pQSxERmxhMTAwbWlBJElOVFNJVEUgPT0gJzE1NScpCkF3Z3QxNTVtZXJjVCA8LSBBd2d0MTU1bWVyY1tBd2d0MTU1bWVyYyRzcE5hbWUgJWluJSAodW5pcXVlKEF3Z3QxNTVtcmlwVCRjb21tb24pKSxdCgpBc3ViMTU1bXJpcCA8LSBBd2d0MTU1bXJpcFRbLGMoMTE6MTIsMjEpXQpBc3ViMTU1bXJpcCRzb3VyY2UgPC0gJ01SSVAnCmNvbG5hbWVzKEFzdWIxNTVtcmlwKSA8LSBjKCJaSVAiLCAic3BOYW1lIiwgImF2ZVd0X2ciLCJzb3VyY2UiKQoKQXN1YjE1NW1lcmMgPC0gQXdndDE1NW1lcmNUWyxjKDEwOjExKV0KQXN1YjE1NW1lcmMkc291cmNlIDwtICdNRVJDJwpBc3ViMTU1bWVyYyRaSVAgPC0gJ05BJwpBc3ViMTU1bWVyYyA8LSBBc3ViMTU1bWVyY1ssYygiWklQIiwgInNwTmFtZSIsICJhdmVXdF9nIiwic291cmNlIildCgpjb21wMTU1YSA8LSByYmluZChBc3ViMTU1bXJpcCxBc3ViMTU1bWVyYykKY291bnQoQXN1YjE1NW1yaXAkc3BOYW1lKQoKZ2dwbG90KGNvbXAxNTVhLCBhZXMoeD1zcE5hbWUsIHk9YXZlV3RfZywgZmlsbCA9IHNvdXJjZSkpICArIAogIGdlb21fYm94cGxvdCgpICsgCiAgeGxhYigiU3BlY2llcyIpICsgCiAgeWxhYigiQXZlcmFnZSBXZWlnaHQgKGcpIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiwgYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLCAgCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFjZSA9ICJwbGFpbiIpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsIGZhY2UgPSAicGxhaW4iKSkgKyAKICB0aGVtZShsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gInBsYWluIiksCiAgICAgICAgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpKQoKcmVzdWx0cy4xNTVhIDwtZGRwbHkoY29tcDE1NWEsLihzcE5hbWUpLGZ1bmN0aW9uKHgpIHN1bW1hcml6ZSh4LApQdmFsdWU9dC50ZXN0KGF2ZVd0X2d+c291cmNlLGRhdGE9eCxuYS5ybT1UUlVFLHBhaXJlZD1GKSRwLnZhbHVlLApFc3RpbWF0ZS5NRVJDPXQudGVzdChhdmVXdF9nfnNvdXJjZSxkYXRhPXgsbmEucm09VFJVRSxwYWlyZWQ9RikkZXN0aW1hdGVbMV0sCkVzdGltYXRlLk1SSVA9dC50ZXN0KGF2ZVd0X2d+c291cmNlLGRhdGE9eCxuYS5ybT1UUlVFLHBhaXJlZD1GKSRlc3RpbWF0ZVsyXSkpCnJlc3VsdHMuMTU1YSRhZGpQIDwtIHAuYWRqdXN0KHJlc3VsdHMuMTU1YSRQdmFsdWUsIG1ldGhvZCA9ICdmZHInLCBuID0gbGVuZ3RoKHJlc3VsdHMuMTU1YSRQdmFsdWUpKQpyZXN1bHRzLjE1NWEkbWVhbkRpZmYgPC0gKHJlc3VsdHMuMTU1YSRFc3RpbWF0ZS5NRVJDIC0gcmVzdWx0cy4xNTVhJEVzdGltYXRlLk1SSVApCnJlc3VsdHMuMTU1YQpgYGAKCkdvaW5nIHRvIHRyeSB0aGlzIGEgZGlmZmVyZW50IHdheSwgaWdub3JpbmcgaW50c2l0ZSBidXQgYWxzbyByZW1vdmluZyBkdXBsaWNhdGUgbWVyY3VyeSByZXN1bHRzLiBXaWxsIG9ubHkgdXNlIG1lcmN1cnkgc2FtcGxlcyBmcm9tIHdpdGhpbiAxMDAgbWkKCmBgYHtyfQpzdHIoREZsYTEwMG1pQSkKc3ViREZsYTEwMG1pQSA8LSBERmxhMTAwbWlBWywxOjIxXQpzdHIoc3ViREZsYTEwMG1pQSkKCiNjYWxjdWxhdGUgYXZlIHdlaWdodCBmb3IgTVJJUApsYW5kT3RpbUF3dCA8LSBsYW5kT3RpbUEKbGFuZE90aW1Bd3QkYXZlV3QgPC0gKGxhbmRPdGltQXd0JHdndF9hYjEqMTAwMCkvbGFuZE90aW1Bd3QkbGFuZGluZyAjaW4gZwoKbWVsdERGbGExMDBtaUEgPC0gc3ViREZsYTEwMG1pQSAlPiUgZGlzdGluY3QoKQpzdHIobWVsdERGbGExMDBtaUEpCnVuaXF1ZShtZWx0REZsYTEwMG1pQSRzcE5hbWUpCgojbm93IGNvbXBhcmUgbXJpcCB0byBtZXJjIGZvciB0aW1lIGZyYW1lIEEgaW4gTG91aXNpYW5hCm1yaXBMQVRlc3RlZEEgPC0gc3Vic2V0KGxhbmRPdGltQXd0LGxhbmRPdGltQXd0JHRlc3RTdGF0dXMxMDBtaSA9PSAnVGVzdGVkJykKbWVyY0xBdGVzdEEgPC0gbWVsdERGbGExMDBtaUFbbWVsdERGbGExMDBtaUEkc3BOYW1lICVpbiUgKHVuaXF1ZShtcmlwTEFUZXN0ZWRBJGNvbW1vbikpLF0KdW5pcXVlKG1lcmNMQXRlc3RBJHNwTmFtZSkKCkFzdWJMQW1yaXAgPC0gbXJpcExBVGVzdGVkQVssYygxMToxMiwyMSldCkFzdWJMQW1yaXAkc291cmNlIDwtICdNUklQJwpjb2xuYW1lcyhBc3ViTEFtcmlwKSA8LSBjKCJaSVAiLCAic3BOYW1lIiwgImF2ZVd0X2ciLCJzb3VyY2UiKQoKQXN1YkxBbWVyYyA8LSBtZXJjTEF0ZXN0QVssYygxMDoxMSldCkFzdWJMQW1lcmMkc291cmNlIDwtICdNRVJDJwpBc3ViTEFtZXJjJFpJUCA8LSAnTkEnCkFzdWJMQW1lcmMgPC0gQXN1YkxBbWVyY1ssYygiWklQIiwgInNwTmFtZSIsICJhdmVXdF9nIiwic291cmNlIildCgpjb21wTEFhIDwtIHJiaW5kKEFzdWJMQW1yaXAsQXN1YkxBbWVyYykKCmNvbXBMQWEkYXZlV3Rfa2cgPC0gY29tcExBYSRhdmVXdF9nLzEwMDAKCmdncGxvdChjb21wTEFhLCBhZXMoeD1zcE5hbWUsIHk9YXZlV3Rfa2csIGZpbGwgPSBzb3VyY2UpKSAgKyAKICBnZW9tX2JveHBsb3QoKSArIAogIHhsYWIoIlNwZWNpZXMiKSArIAogIHlsYWIoIkF2ZXJhZ2UgV2VpZ2h0IChnKSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksICAKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBmYWNlID0gInBsYWluIiksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFjZSA9ICJwbGFpbiIpKSArIAogIHRoZW1lKGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAicGxhaW4iKSwKICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIikpICsgY29vcmRfZmxpcCgpCgpyZXN1bHRzLkxBYSA8LWRkcGx5KGNvbXBMQWEsLihzcE5hbWUpLGZ1bmN0aW9uKHgpIHN1bW1hcml6ZSh4LApQdmFsdWU9dC50ZXN0KGF2ZVd0X2d+c291cmNlLGRhdGE9eCxuYS5ybT1UUlVFLHBhaXJlZD1GKSRwLnZhbHVlLApFc3RpbWF0ZS5NRVJDPXQudGVzdChhdmVXdF9nfnNvdXJjZSxkYXRhPXgsbmEucm09VFJVRSxwYWlyZWQ9RikkZXN0aW1hdGVbMV0sCkVzdGltYXRlLk1SSVA9dC50ZXN0KGF2ZVd0X2d+c291cmNlLGRhdGE9eCxuYS5ybT1UUlVFLHBhaXJlZD1GKSRlc3RpbWF0ZVsyXSkpCnJlc3VsdHMuTEFhJGFkalAgPC0gcC5hZGp1c3QocmVzdWx0cy5MQWEkUHZhbHVlLCBtZXRob2QgPSAnZmRyJywgbiA9IGxlbmd0aChyZXN1bHRzLkxBYSRQdmFsdWUpKQpyZXN1bHRzLkxBYSRtZWFuRGlmZiA8LSAocmVzdWx0cy5MQWEkRXN0aW1hdGUuTUVSQyAtIHJlc3VsdHMuTEFhJEVzdGltYXRlLk1SSVApCnJlc3VsdHMuTEFhCgojIyN0aW1lZnJhbWUgQgpsYW5kT3RpbUJ3dCA8LSBsYW5kT3RpbUIKbGFuZE90aW1Cd3QkYXZlV3QgPC0gKGxhbmRPdGltQnd0JHdndF9hYjEqMTAwMCkvbGFuZE90aW1Cd3QkbGFuZGluZyAjaW4gZwoKc3RyKERGbGExMDBtaUJBKQpzdWJERmxhMTAwbWlCIDwtIERGbGExMDBtaUJBWywxOjIxXQpzdHIoc3ViREZsYTEwMG1pQikKCm1lbHRERmxhMTAwbWlCIDwtIHN1YkRGbGExMDBtaUIgJT4lIGRpc3RpbmN0KCkKc3RyKG1lbHRERmxhMTAwbWlCKQp1bmlxdWUobWVsdERGbGExMDBtaUIkc3BOYW1lKQoKI25vdyBjb21wYXJlIG1yaXAgdG8gbWVyYyBmb3IgdGltZSBmcmFtZSBCIGluIExvdWlzaWFuYQptcmlwTEFUZXN0ZWRCIDwtIHN1YnNldChsYW5kT3RpbUJ3dCxsYW5kT3RpbUJ3dCR0ZXN0U3RhdHVzMTAwbWkgPT0gJ1Rlc3RlZCcpCm1lcmNMQXRlc3RCIDwtIG1lbHRERmxhMTAwbWlCW21lbHRERmxhMTAwbWlCJHNwTmFtZSAlaW4lICh1bmlxdWUobXJpcExBVGVzdGVkQiRjb21tb24pKSxdCnVuaXF1ZShtZXJjTEF0ZXN0QiRzcE5hbWUpCnN0cihtcmlwTEFUZXN0ZWRCKQoKQnN1YkxBbXJpcCA8LSBtcmlwTEFUZXN0ZWRCWyxjKDExOjEyLDIwKV0KQnN1YkxBbXJpcCRzb3VyY2UgPC0gJ01SSVAnCmNvbG5hbWVzKEJzdWJMQW1yaXApIDwtIGMoIlpJUCIsICJzcE5hbWUiLCAiYXZlV3RfZyIsInNvdXJjZSIpCgpCc3ViTEFtZXJjIDwtIG1lcmNMQXRlc3RCWyxjKDEwOjExKV0KQnN1YkxBbWVyYyRzb3VyY2UgPC0gJ01FUkMnCkJzdWJMQW1lcmMkWklQIDwtICdOQScKQnN1YkxBbWVyYyA8LSBCc3ViTEFtZXJjWyxjKCJaSVAiLCAic3BOYW1lIiwgImF2ZVd0X2ciLCJzb3VyY2UiKV0KCmNvbXBMQWIgPC0gcmJpbmQoQnN1YkxBbXJpcCxCc3ViTEFtZXJjKQpjb21wTEFiJGF2ZVd0X2tnIDwtIGNvbXBMQWIkYXZlV3RfZy8xMDAwCgpnZ3Bsb3QoY29tcExBYiwgYWVzKHg9c3BOYW1lLCB5PWF2ZVd0X2csIGZpbGwgPSBzb3VyY2UpKSAgKyAKICBnZW9tX2JveHBsb3QoKSArIAogIHhsYWIoIlNwZWNpZXMiKSArIAogIHlsYWIoIkF2ZXJhZ2UgV2VpZ2h0IChnKSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksICAKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBmYWNlID0gInBsYWluIiksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFjZSA9ICJwbGFpbiIpKSArIAogIHRoZW1lKGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAicGxhaW4iKSwKICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIikpCgpyZXN1bHRzLkxBYiA8LWRkcGx5KGNvbXBMQWIsLihzcE5hbWUpLGZ1bmN0aW9uKHgpIHN1bW1hcml6ZSh4LApQdmFsdWU9dC50ZXN0KGF2ZVd0X2d+c291cmNlLGRhdGE9eCxuYS5ybT1UUlVFLHBhaXJlZD1GKSRwLnZhbHVlLApFc3RpbWF0ZS5NRVJDPXQudGVzdChhdmVXdF9nfnNvdXJjZSxkYXRhPXgsbmEucm09VFJVRSxwYWlyZWQ9RikkZXN0aW1hdGVbMV0sCkVzdGltYXRlLk1SSVA9dC50ZXN0KGF2ZVd0X2d+c291cmNlLGRhdGE9eCxuYS5ybT1UUlVFLHBhaXJlZD1GKSRlc3RpbWF0ZVsyXSkpCnJlc3VsdHMuTEFiJGFkalAgPC0gcC5hZGp1c3QocmVzdWx0cy5MQWIkUHZhbHVlLCBtZXRob2QgPSAnZmRyJywgbiA9IGxlbmd0aChyZXN1bHRzLkxBYiRQdmFsdWUpKQpyZXN1bHRzLkxBYiRtZWFuRGlmZiA8LSAocmVzdWx0cy5MQWIkRXN0aW1hdGUuTUVSQyAtIHJlc3VsdHMuTEFiJEVzdGltYXRlLk1SSVApCnJlc3VsdHMuTEFiCmBgYAoKT24gdG8gRkxvcmlkYSEKCmBgYHtyfQpsYW5kVHRpbUF3dCA8LSBsYW5kVHRpbUEKbGFuZFR0aW1Bd3QkYXZlV3QgPC0gKGxhbmRUdGltQXd0JHdndF9hYjEqMTAwMCkvbGFuZFR0aW1Bd3QkbGFuZGluZyAjaW4gZwoKc3RyKERGZmwxMDBtaUEpCnVuaXF1ZShERmZsMTAwbWlBJElOVFNJVEUpCnN1YkRGZmwxMDBtaUEgPC0gREZmbDEwMG1pQVssMTozNF0Kc3RyKHN1YkRGZmwxMDBtaUEpCgptZWx0REZmbDEwMG1pQSA8LSBzdWJERmZsMTAwbWlBICU+JSBkaXN0aW5jdCgpCnN0cihtZWx0REZmbDEwMG1pQSkKdW5pcXVlKG1lbHRERmZsMTAwbWlBJFNwZWNpZXMpCgojbmVlZCB0byBjb252ZXJ0IGxvd2VyIGNhc2UgdG8gdXBwZXIgY2FzZSBmb3IgdGhlIHR3byBkYXRhZnJhbWVzIHRvIGJlIGFibGUgc2VhcmNoIHByb3Blcmx5Cm1lbHRERmZsMTAwbWlBJFNwZWNpZXMgPC0gdG91cHBlcihtZWx0REZmbDEwMG1pQSRTcGVjaWVzKQptZWx0REZmbDEwMG1pQSRTcGVjaWVzIDwtIHRyaW13cyhtZWx0REZmbDEwMG1pQSRTcGVjaWVzLCB3aGljaCA9IGMoInJpZ2h0IiksIHdoaXRlc3BhY2UgPSAiWyBcdFxyXG5dIikKCiNub3cgY29tcGFyZSBtcmlwIHRvIG1lcmMgZm9yIHRpbWUgZnJhbWUgQSBpbiBMb3Vpc2lhbmEKbXJpcEZMVGVzdGVkQSA8LSBzdWJzZXQobGFuZFR0aW1Bd3QsbGFuZFR0aW1Bd3QkdGVzdFN0YXR1czEwMG1pID09ICdUZXN0ZWQnKQptZXJjRkx0ZXN0QSA8LSBtZWx0REZmbDEwMG1pQVttZWx0REZmbDEwMG1pQSRTcGVjaWVzICVpbiUgKHVuaXF1ZShtcmlwRkxUZXN0ZWRBJGNvbW1vbikpLF0KdW5pcXVlKG1yaXBGTFRlc3RlZEEkY29tbW9uKQp1bmlxdWUobWVyY0ZMdGVzdEEkU3BlY2llcykKCnN0cihtcmlwRkxUZXN0ZWRBKQpzdHIobWVyY0ZMdGVzdEEpCm1lcmNGTHRlc3RBCkFzdWJGTG1yaXAgPC0gbXJpcEZMVGVzdGVkQVssYygxMToxMiwyMCldCkFzdWJGTG1yaXAkc291cmNlIDwtICdNUklQJwpjb2xuYW1lcyhBc3ViRkxtcmlwKSA8LSBjKCJaSVAiLCAic3BOYW1lIiwgImF2ZVd0X2ciLCJzb3VyY2UiKQoKQXN1YkZMbWVyYyA8LSBtZXJjRkx0ZXN0QVssYygxMiwxOCldCkFzdWJGTG1lcmMkc291cmNlIDwtICdNRVJDJwpBc3ViRkxtZXJjJFpJUCA8LSAnTkEnCkFzdWJGTG1lcmMgPC0gQXN1YkZMbWVyY1ssYygiWklQIiwgIlNwZWNpZXMiLCAiV2hvbGVfd2VpZ2h0Iiwic291cmNlIildCmNvbG5hbWVzKEFzdWJGTG1lcmMpIDwtIGMoIlpJUCIsICJzcE5hbWUiLCAiYXZlV3RfZyIsInNvdXJjZSIpCgpjb21wRkxhIDwtIHJiaW5kKEFzdWJGTG1yaXAsQXN1YkZMbWVyYykKCmdncGxvdChjb21wRkxhLCBhZXMoeD1zcE5hbWUsIHk9YXZlV3RfZywgZmlsbCA9IHNvdXJjZSkpICArIAogIGdlb21fYm94cGxvdCgpICsgCiAgeGxhYigiU3BlY2llcyIpICsgCiAgeWxhYigiQXZlcmFnZSBXZWlnaHQgKGcpIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiwgYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLCAgCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFjZSA9ICJwbGFpbiIpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsIGZhY2UgPSAicGxhaW4iKSkgKyAKICB0aGVtZShsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gInBsYWluIiksCiAgICAgICAgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpKQoKI25vdCBlbm91Z2ggb2JzZXJ2YXRpb25zIG9mIG1lcmN1cnkgd2VpZ2h0cyB0byBydW4KcmVzdWx0cy5GTGEgPC1kZHBseShjb21wRkxhLC4oc3BOYW1lKSxmdW5jdGlvbih4KSBzdW1tYXJpemUoeCwKUHZhbHVlPXQudGVzdChhdmVXdF9nfnNvdXJjZSxkYXRhPXgsbmEucm09VFJVRSxwYWlyZWQ9RikkcC52YWx1ZSwKRXN0aW1hdGUuTUVSQz10LnRlc3QoYXZlV3RfZ35zb3VyY2UsZGF0YT14LG5hLnJtPVRSVUUscGFpcmVkPUYpJGVzdGltYXRlWzFdLApFc3RpbWF0ZS5NUklQPXQudGVzdChhdmVXdF9nfnNvdXJjZSxkYXRhPXgsbmEucm09VFJVRSxwYWlyZWQ9RikkZXN0aW1hdGVbMl0pKQpyZXN1bHRzLkZMYSRhZGpQIDwtIHAuYWRqdXN0KHJlc3VsdHMuRkxhJFB2YWx1ZSwgbWV0aG9kID0gJ2ZkcicsIG4gPSBsZW5ndGgocmVzdWx0cy5GTGEkUHZhbHVlKSkKcmVzdWx0cy5GTGEkbWVhbkRpZmYgPC0gKHJlc3VsdHMuRkxhJEVzdGltYXRlLk1FUkMgLSByZXN1bHRzLkZMYSRFc3RpbWF0ZS5NUklQKQpyZXN1bHRzLkZMYQoKIyMjdGltZWZyYW1lIEIKbGFuZFR0aW1Cd3QgPC0gbGFuZFR0aW1CCmxhbmRUdGltQnd0JGF2ZVd0IDwtIChsYW5kVHRpbUJ3dCR3Z3RfYWIxKjEwMDApL2xhbmRUdGltQnd0JGxhbmRpbmcgI2luIGcKCnN0cihERmZsMTAwbWlCKQpzdWJERmZsMTAwbWlCIDwtIERGZmwxMDBtaUJbLDE6MzRdCnN0cihzdWJERmZsMTAwbWlCKQoKbWVsdERGZmwxMDBtaUIgPC0gc3ViREZmbDEwMG1pQiAlPiUgZGlzdGluY3QoKQpzdHIobWVsdERGZmwxMDBtaUIpCgojbmVlZCB0byBjb252ZXJ0IGxvd2VyIGNhc2UgdG8gdXBwZXIgY2FzZSBmb3IgdGhlIHR3byBkYXRhZnJhbWVzIHRvIGJlIGFibGUgc2VhcmNoIHByb3Blcmx5Cm1lbHRERmZsMTAwbWlCJFNwZWNpZXMgPC0gdG91cHBlcihtZWx0REZmbDEwMG1pQiRTcGVjaWVzKQptZWx0REZmbDEwMG1pQiRTcGVjaWVzIDwtIHRyaW13cyhtZWx0REZmbDEwMG1pQiRTcGVjaWVzLCB3aGljaCA9IGMoInJpZ2h0IiksIHdoaXRlc3BhY2UgPSAiWyBcdFxyXG5dIikKCiNub3cgY29tcGFyZSBtcmlwIHRvIG1lcmMgZm9yIHRpbWUgZnJhbWUgQSBpbiBMb3Vpc2lhbmEKbXJpcEZMVGVzdGVkQiA8LSBzdWJzZXQobGFuZFR0aW1Cd3QsbGFuZFR0aW1Cd3QkdGVzdFN0YXR1czEwMG1pID09ICdUZXN0ZWQnKQptZXJjRkx0ZXN0QiA8LSBtZWx0REZmbDEwMG1pQlttZWx0REZmbDEwMG1pQiRTcGVjaWVzICVpbiUgKHVuaXF1ZShtcmlwRkxUZXN0ZWRCJGNvbW1vbikpLF0KdW5pcXVlKG1lcmNGTHRlc3RCJFNwZWNpZXMpCnN0cihtcmlwRkxUZXN0ZWRCKQp1bmlxdWUobWVsdERGZmwxMDBtaUIkU3BlY2llcykKdW5pcXVlKG1yaXBGTFRlc3RlZEIkY29tbW9uKQoKQnN1YkZMbXJpcCA8LSBtcmlwRkxUZXN0ZWRCWyxjKDExOjEyLDIwKV0KQnN1YkZMbXJpcCRzb3VyY2UgPC0gJ01SSVAnCmNvbG5hbWVzKEJzdWJGTG1yaXApIDwtIGMoIlpJUCIsICJzcE5hbWUiLCAiYXZlV3RfZyIsInNvdXJjZSIpCgpCc3ViRkxtZXJjIDwtIG1lcmNGTHRlc3RCWyxjKDEyLDE4KV0KQnN1YkZMbWVyYyRzb3VyY2UgPC0gJ01FUkMnCkJzdWJGTG1lcmMkWklQIDwtICdOQScKQnN1YkZMbWVyYyA8LSBCc3ViRkxtZXJjWyxjKCJaSVAiLCAiU3BlY2llcyIsICJXaG9sZV93ZWlnaHQiLCJzb3VyY2UiKV0KY29sbmFtZXMoQnN1YkZMbWVyYykgPC0gYygiWklQIiwgInNwTmFtZSIsICJhdmVXdF9nIiwic291cmNlIikKCmNvbXBGTGIgPC0gcmJpbmQoQnN1YkZMbXJpcCxCc3ViRkxtZXJjKQoKZ2dwbG90KGNvbXBGTGIsIGFlcyh4PXNwTmFtZSwgeT1hdmVXdF9nLCBmaWxsID0gc291cmNlKSkgICsgCiAgZ2VvbV9ib3hwbG90KCkgKyAKICB4bGFiKCJTcGVjaWVzIikgKyAKICB5bGFiKCJBdmVyYWdlIFdlaWdodCAoZykiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiLCBhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksICAKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBmYWNlID0gInBsYWluIiksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFjZSA9ICJwbGFpbiIpKSArIAogIHRoZW1lKGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAicGxhaW4iKSwKICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIikpCgojbm90IGVub3VnaCBvYnNlcnZhdGlvbnMKcmVzdWx0cy5GTGIgPC1kZHBseShjb21wRkxiLC4oc3BOYW1lKSxmdW5jdGlvbih4KSBzdW1tYXJpemUoeCwKUHZhbHVlPXQudGVzdChhdmVXdF9nfnNvdXJjZSxkYXRhPXgsbmEucm09VFJVRSxwYWlyZWQ9RikkcC52YWx1ZSwKRXN0aW1hdGUuTUVSQz10LnRlc3QoYXZlV3RfZ35zb3VyY2UsZGF0YT14LG5hLnJtPVRSVUUscGFpcmVkPUYpJGVzdGltYXRlWzFdLApFc3RpbWF0ZS5NUklQPXQudGVzdChhdmVXdF9nfnNvdXJjZSxkYXRhPXgsbmEucm09VFJVRSxwYWlyZWQ9RikkZXN0aW1hdGVbMl0pKQpyZXN1bHRzLkZMYiRhZGpQIDwtIHAuYWRqdXN0KHJlc3VsdHMuRkxiJFB2YWx1ZSwgbWV0aG9kID0gJ2ZkcicsIG4gPSBsZW5ndGgocmVzdWx0cy5GTGIkUHZhbHVlKSkKcmVzdWx0cy5GTGIkbWVhbkRpZmYgPC0gKHJlc3VsdHMuRkxiJEVzdGltYXRlLk1FUkMgLSByZXN1bHRzLkZMYiRFc3RpbWF0ZS5NUklQKQpyZXN1bHRzLkZMYgpgYGAKCgoKQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkN0cmwrQWx0K0kqLgoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDdHJsK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuCgpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuCg==